使用BinaryFormatter进行二进制序列化引用

时间:2011-04-07 20:47:16

标签: .net serialization reference binaryformatter

鉴于以下类结构,Bar会按预期序列化/反序列化吗?

public class Foo { int x; string y; }

[Serializable]
public class Bar {
   Foo[] AllFoos;
   Foo SelectedFoo;

   public Bar(Foo[] allFoos, int selectedFooIndex) { 
     this.AllFoos = allFoos; 
     this.SelectedFoo = allFoos[selectedFooIndex]; 
   } 
}

我对几件事感到好奇:

1)BinaryFormatter是否要求使用[Serializable]属性修饰Bar类或实现ISerializable接口?

2)Foo类是否还需要使用[Serializable]属性进行修饰?

3)如果Bar只是使用[Serializable]属性进行修饰,那么Bar.SelectedFoo字段是否会正确地保持对数组的引用?或者我最终会得到那个Foo的副本?

1 个答案:

答案 0 :(得分:2)

  

1)BinaryFormatter是否要求使用[Serializable]属性修饰Bar类或实现ISerializable接口?

是的,如果要使用BinaryFormatter来序列化Bar实例,它会这样做。

  

2)Foo类是否还需要使用[Serializable]属性进行修饰?

是的,除非您创建不涉及序列化Foo对象实例的自定义序列化机制。例如,您可以单独序列化x和y组件,并在反序列化代码中从它们创建新的Foo实例。否则,它必须具有属性或接口。

  

3)如果Bar只是使用[Serializable]属性进行修饰,那么Bar.SelectedFoo字段是否会正确地保持对数组的引用?或者我最终会得到那个Foo的副本?

如果我没记错的话,数组不能像这样序列化。您必须提供自己的机制(通过ISerializable接口)来编写和读取数组。

但是,通常,如果使用BinaryFormatter序列化彼此相互引用的可序列化对象的图形,则它将正确地重新创建引用而不复制对象。这应包括您在自定义序列化代码中指定的对象,只要您使用Serializable修饰Foo并将相同的对象实例从数组和字段传递给格式化程序。