Sof*_*eek 73 c# inheritance serialization attributes iserializable
使用Serializable
属性和实现ISerializable
接口有什么区别?
t0m*_*13b 41
当您使用该SerializableAttribute
属性时,您将在编译时在字段上放置一个属性,以便在运行时,序列化工具将通过对类/模块/程序集执行反射来了解基于属性的序列化内容类型.
[Serializable]
public class MyFoo { … }
Run Code Online (Sandbox Code Playgroud)
以上表明序列化工具应序列化整个类MyFoo
,而:
public class MyFoo
{
private int bar;
[Serializable]
public int WhatBar
{
get { return this.bar; }
}
}
Run Code Online (Sandbox Code Playgroud)
使用该属性,您可以有选择地选择需要序列化的字段.
实现ISerializable
接口时,序列化有效地被自定义版本覆盖,通过覆盖和(并通过提供表单的构造函数),可以更好地控制数据的序列化.GetObjectData
SetObjectData
MyFoo(SerializationInfo info, StreamingContext context)
另请参阅StackOverflow上此自定义序列化的示例.它显示了如何使序列化向后兼容序列化数据的不同版本.
希望这可以帮助.
Seg*_*ult 20
该SerializableAttribute指示做框架默认序列化过程.如果需要更多控制,可以实现ISerializable接口.然后,您可以放置自己的代码来序列化GetObjectData
方法中的SerializationInfo
对象,并更新传递给它的对象.
该ISerializable
接口允许您实现默认序列化之外的自定义序列化。当你实现ISerializable
接口时,你必须重写GetObjectData
方法,如下所示
public void GetObjectData (SerializationInfo serInfo,
StreamingContext streamContext)
{
// Implement custom Serialization
}
Run Code Online (Sandbox Code Playgroud)