8

这个问题与我感兴趣的问题很接近,但并不完全。

我有一个用 C# 编写的 .NET WinForms 应用程序。我有一个ListView显示 C# 对象数组的控件。我已经将它连接起来,以便您可以将这些列表视图项拖放到同一应用程序中的不同表单中,并且它会正确地将对象数组(类型Session)传递给该其他表单的放置处理程序。

但是,我现在想在运行应用程序的多个实例时支持跨进程拖放。这似乎会起作用(例如GetDataPresent成功),但当我实际尝试检索数据时最终会引发异常——无法object[]转换为Session[].

if (e.Data.GetDataPresent("Fiddler.Session[]"))
{
   Session[] oDroppedSessions;
   try
   {
      oDroppedSessions = (Session[])e.Data.GetData("Fiddler.Session[]");
   }
   catch (Exception eX)
   {  // reaches here 
   }
}

任何人都知道我是否必须为我的对象实施ISerializable才能使这项工作?通常,我会简单地尝试一下,但是ISerializable为这个类实现将是非常重要的,我担心这样做可能会产生奇怪的副作用。


更新:实施ISerializable无济于事-永远不会调用该方法。同样,将Serializable属性添加到类中完全没有影响。还有其他想法吗?

4

3 回答 3

6

您正在跨越进程边界,对象引用在另一个进程中无效。DataObject 类支持序列化对象以使它们穿过墙壁,它使用 BinaryFormatter。所以,是的,您需要将 [Serializable] 属性应用于您的类,并确保您的对象可以正确反序列化。

于 2010-01-21T18:04:58.547 回答
0

好的,这是一个镜头,而不是使用整个会话数组,尝试像这样单独进行......

   会话[] oDroppedSessions;
   尝试
   {
      if (e.Data.GetData("Fiddler.Session[]") != null){
          object[] objs = e.Data.GetData("Fiddler.Session[]");
          if (objs != null && objs.Length > 1){
             oDroppedSessions = new Session[objs.Length];
             int nIndex = 0;
             foreach(objs 中的对象 obj){
                if (obj 是会话){
                  oDroppedSessions[nIndex] = (Session)obj;
                  n索引++;
                }
             }
          }
      }
   }
   捕获(异常 eX)
   { // 到达这里 }

值得一试,除了因为我不完全理解会话部分而在脚上射击自己,试试吧......

希望这会有所帮助,最好的问候,汤姆。

于 2010-01-21T01:56:52.207 回答
-1

您可以使用“as”进行强制转换,这将避免异常(如果强制转换失败,“as”将返回“null”而不抛出异常) - 但我认为这不会解决您的问题(它只会避免实际例外),因为我同意您可能必须使您的类可序列化。您可以通过注释掉更难使其工作的字段来测试您的假设 - 只是现在来测试它。

于 2010-01-21T01:55:24.570 回答