使用 Serialized 属性和实现 ISerialized 有什么区别?

问题描述 投票:0回答:5

使用

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

c# inheritance attributes serialization iserializable
5个回答
45
投票

当您使用

SerializableAttribute
属性时,您将在编译时将属性放在字段上,这样在运行时,序列化工具将通过执行反射来根据属性知道要序列化的内容类/模块/程序集类型。

[Serializable]
public class MyFoo { … }

上面表明序列化工具应该序列化整个类

MyFoo
,而:

public class MyFoo
{
    private int bar;

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

使用该属性,您可以有选择地选择哪些字段需要序列化。

当您实现

ISerializable
接口时,通过重写
GetObjectData
SetObjectData
(并提供
MyFoo(SerializationInfo info, StreamingContext context)
形式的构造函数),序列化有效地被自定义版本覆盖,将更好地控制数据的序列化。

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

希望这有帮助。


22
投票

SerializedAttribute 指示框架执行默认的序列化过程。如果您需要更多控制,可以实现ISerialized接口。然后,您可以在

GetObjectData
方法中放入自己的代码来序列化对象,并更新传递给它的
SerializationInfo
对象。


5
投票

ISerializable
接口可让您实现除默认值之外的自定义序列化。 当你实现
ISerializable
接口时,你必须重写
GetObjectData
方法,如下

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

2
投票

ISerialize 强制你手动实现序列化逻辑,而通过 Serialized 属性标记(你是认真的吗?)会告诉 Binary 序列化器这个类可以序列化。它会自动完成。


0
投票

继承 ISerialized 允许您自定义实现(反)序列化。仅使用 Serialized 属性时,序列化(反)序列化只能由属性控制,灵活性较差。

© www.soinside.com 2019 - 2024. All rights reserved.