C#序列化限制
本文关键字:序列化 | 更新日期: 2023-09-27 18:26:41
我想在C#中实现一个通用的Memento模式。它工作得很好,但我使用Serializable()属性对对象进行深度复制。我的实现使用泛型,所以如果有人使用它,他必须将类作为类型。现在,来自user的类也必须具有Attribute Serializable()。使用Serializable()的类有什么限制吗?
事实上:
- 是否存在任何性能问题
- 可以使用接口吗
- 有可能使用惰性吗
- 是否可以使用"自动属性"
我不知道属性是如何工作的,所以以这样一种全局的方式使用它有点可怕。
关于
- 对于在内存中克隆的小型模型,通常不是
- 不稳定;当使用
[Serializable]
时,通常使用BinaryFormatter
-它查看对象本身;它们实现什么接口并不重要-不使用接口 - 是的,原因相同,但模型中的所有类型都必须是
[Serializable]
- 是的,出于同样的原因;注意:默认的
BinaryFormatter
实现是查看字段,它甚至不会触及属性
就我个人而言,我试图建议不要使用BinaryFormatter
,但这可能不是不合理的使用。然而请注意,很容易意外地将额外的对象吸入模型中,通常必须通过event
s。注意,最好将所有event
s标记为非序列化:
[field:NonSerialized]
public event EventHandler Something;
(如果使用显式add
/remove
访问者,则直接应用于字段)
还要注意,任何成员都喜欢:
public object Tag {get;set;} // caller-defined
也可能是CCD_ 10。
就我个人而言,我更喜欢一个不同的序列化程序,但是:这通常会起作用。不过,我要说的是:尽量避免持久化BinaryFormatter
的输出,因为很难保证代码修订版之间的兼容性。
我不知道属性是如何工作的
它什么都不做,只是添加了一个IL标志,上面写着"顺便说一句,认为这可以序列化";实际上,大多数序列化程序甚至都不查看此标志,但BinaryFormatter
是查看此标志的少数序列化程序之一。这里真正的代码是BinaryFormatter
,它基本上是:
- 我以前见过这个物体吗?如果是,则只存储密钥
- 它是什么类型的?是
[Serializable]
吗?存储类型信息 - 发明一个新的引用并将其存储为身份
- 它有自定义的序列化程序吗?如果是:用那个
- 它有哪些字段?依次访问每个并存储名称/值对