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 SetObjectDataMyFoo(SerializationInfo info, StreamingContext context)

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

希望这可以帮助.

  • 在哪个版本的.NET中可以将`Serializable`属性添加到属性中?MSDN表示它只能应用于类,结构,枚举和委托. (11认同)
  • 没有.Serializable属性不能应用于属性,只能应用于class,struct和enum以及委托声明. (5认同)
  • 恰恰相反:当类用`SerializableAttribute`修饰时,一个成员可以被标记为`NonSerializedAttribute`被跳过,因为多人(和MSDN)说,当重建某个对象在不同的​​环境中没有意义时,它是明智的是没有序列化...... (3认同)

Seg*_*ult 20

SerializableAttribute指示做框架默认序列化过程.如果需要更多控制,可以实现ISerializable接口.然后,您可以放置​​自己的代码来序列化GetObjectData方法中的SerializationInfo对象,并更新传递给它的对象.

  • 请注意,即使您实现了ISerializable接口,仍然必须标记类[Serializable]. (18认同)
  • 如果实现ISerializable,那么实现反序列化构造函数也是习惯的(甚至可能是必需的):protected SomeClass(SerializationInfo info,StreamingContext context) (4认同)

Asa*_*sad 5

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

public void GetObjectData (SerializationInfo serInfo, 
                                    StreamingContext streamContext)
{
   // Implement custom Serialization
}
Run Code Online (Sandbox Code Playgroud)