使用Serializable属性和实现ISerializable有什么区别?

使用Serializable属性和实现ISerializable接口有什么区别?

当你使用SerializableAttribute属性时,你需要在编译时在字段上放置一个属性,这样在运行的时候,序列化工具可以根据属性对类/模块/组装types。

 [Serializable] public class MyFoo { … } 

上面的表示序列化设施应该序列化整个类MyFoo ,而:

 public class MyFoo { private int bar; [Serializable] public int WhatBar { get { return this.bar; } } } 

使用该属性,您可以selectselect哪些字段需要序列化。

当你实现ISerializable接口时 ,通过覆盖GetObjectData SetObjectData (以及通过提供forms为MyFoo(SerializationInfo info, StreamingContext context)的构造函数),序列化可以被自定义版本有效地覆盖,那么将会有更好的控制数据的序列化。

另请参阅StackOverflow上的自定义序列化示例 。 它显示了如何保持序列化向后兼容不同版本的序列化数据。

希望这可以帮助。

SerializableAttribute指示框架执行默认的序列化过程。 如果你需要更多的控制,你可以实现ISerializable接口 。 然后你将把自己的代码序列化在GetObjectData方法中的对象,并更新传入的SerializationInfo对象。

ISerializable接口允许您实现非默认的自定义序列化 。 当你实现ISerializable接口时,你必须重写GetObjectData方法如下

 public void GetObjectData (SerializationInfo serInfo, StreamingContext streamContext) { // Implement custom Serialization } 

ISerialize迫使你人为地实现序列化逻辑,而用Serializable属性标记(你的意思是什么?)会告诉二进制序列化器这个类可以被序列化。 它会自动执行。

从ISerializableinheritance允许您自定义实现(德)序列化。 仅使用Serializable属性时,(de)序列化只能由属性控制,不够灵活。