将一个类的实例设置为另一个类时的SerializationException

时间:2009-01-10 20:07:53

标签: c# exception class

我正在尝试在两个单独的类之间传递一个类的实例,如下所示。

//classes
public class A
{
  public string name;
  public string data;
}

public class B : MarshalByRefObject
{
  public A _a;
}

public class C : MarshalByRefObject
{
  public A _a;
}

//main program
static void Main(string[] args)
{
  B _b = new B();
  C _c = new C();

  _b._a = new A();

  _c._a = _b._a;
}

A和B都存在,我想让C中的A类实例等于B中的A类实例。我基本上想确保B和C都有A的完全相同的副本。

但是,当我尝试运行它时,我得到一个SerializationException,说A类没有标记为Serializable。我知道我以前做过这样的事情并且它从来没有想要它被序列化。为什么它还需要这个呢?我认为这是针对xml序列化的。

我尝试将[Serializable]属性添加到A类,但异常显然已经消失。但是在这样做之后,对B类内部的A进行更改将不会传播到C内部的A实例...就像它们现在是完全独立的副本一样。

有什么想法吗?

编辑:没有意识到这在此之前很重要,但经过一些环顾四周后,我认为确实如此。类B和C继承自MarshalByRefObject类。也许这有助于解决这个问题。我已经更新了上面的课程。

2 个答案:

答案 0 :(得分:1)

我最近遇到了类似的问题(确保在反序列化后使用单例盒装的值类型。)

为了解决我的问题,我不得不使用ISerializationSurrogate和SurrogateSelector来修复引用,而不是让它重新装箱。

答案 1 :(得分:0)

我在Visual Studio中运行的代码上没有这样的异常。我根本没有看到任何序列化,你只是在不同的对象上点引用。