只读(不可变)可序列化类

Posted

技术标签:

【中文标题】只读(不可变)可序列化类【英文标题】:A read only (immutable) serializeable class 【发布时间】:2011-06-11 15:32:22 【问题描述】:

我设计了一个具有两个属性的类——字符串类型和对象列表。我正在加载一些 xml 并将其反序列化为类的实例,效果很好。我想要的是每个实例的所有内容都是不可变的。这些类作为 API 公开,为了完整性,我不希望更改对象的值。如果程序员想要不同的东西,他们应该创建新实例并设置值。

通常我会使用 ReadOnlyCollection 和 readonly 属性来执行此操作,但这会扰乱反序列化。我可以在这里做什么?

【问题讨论】:

【参考方案1】:

污染你的领域模型是不值得的,只是对 xml 序列化器更友好,这样你就可以实现ISerializable Interface 并为任何不适合序列化的集合编写自己的序列化例程。

void GetObjectData(SerializationInfo info, StreamingContext context)

  // ...

【讨论】:

【参考方案2】:

你可以在你的课堂上实现ISerializable。这样,当类被反序列化时,一个特殊的构造函数被调用,你可以让你的类真正不可变

【讨论】:

【参考方案3】:

实现 ISerializable 接口并手动完成

【讨论】:

以上是关于只读(不可变)可序列化类的主要内容,如果未能解决你的问题,请参考以下文章

Java原理探索带你探究String类不可变的特性 | Java开发实战

如何使以下类不可变?

OCaml 中的 D 类不可变数据切片

不可变对象

不可变只读引用类型和 FXCop 违规:不要声明只读可变引用类型

如何使用 C# 中的 System.Xml.Serialization 使对象不可变但可序列化?