使用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
和 (以及通过提供forms为SetObjectData
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)序列化只能由属性控制,不够灵活。