鉴于以下类结构,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的副本?
答案 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并将相同的对象实例从数组和字段传递给格式化程序。