SerializableAttribute用法

时间:2011-05-13 09:12:32

标签: .net serialization

我需要使用C序列化一个类BinaryFormatter

所以我将C标记为[Serializable] C继承了抽象 B类。

B NOT 标记为[Serializable] B继承A类,

A[Serializable],并且还实现了ISerializable;

我们可以拥有什么样的情况?

AProperty将被序列化 BProperty序列化(?)
CProperty将被序列化

3 个答案:

答案 0 :(得分:2)

您的修改所有内容;如果A实施ISerializable,则他们所有实施ISerializable。这样,您就可以使用自定义序列化,因此GetObjectDataA中的B和序列化构造函数代码确定了 完全 的行为/ C / ISerializable


原始答案,当没有提及BinaryFormatter

序列化通常基于运行时实际对象的类型,[Serializable](映射到B)是字段序列化程序。但是,如果[Serializable]未标记为BinaryFormatter,则无法序列化 ISerializable(除非它是A);这样:

  • 如果是A,则所有C字段都将被序列化
  • 如果是B,则会抛出异常
  • (它不能是BinaryFormatter,因为它是抽象的;但如果是,那也会引发它)

如果使用BinaryFormatter(并且我个人认为BinaryFormatter在大多数情况下都不是一个好选择),那么行为将取决于特定的序列化器。

我的建议:使用不同的序列化程序;有很多。几乎所有(IMO)选择都比{{1}}更好。

答案 1 :(得分:0)

尝试使用其他序列化技术,例如Google的Protofol Buffers,它可以帮助您重建整个应用程序,当您更改AProperty类时,该应用程序会消耗此序列化对象。

JSON是另一种选择。

答案 2 :(得分:0)

如果A是一个基类并且它是可选择的,那么B将自动变为可引发的。