C#序列化限制

本文关键字:序列化 | 更新日期: 2023-09-27 18:26:41

我想在C#中实现一个通用的Memento模式。它工作得很好,但我使用Serializable()属性对对象进行深度复制。我的实现使用泛型,所以如果有人使用它,他必须将类作为类型。现在,来自user的类也必须具有Attribute Serializable()。使用Serializable()的类有什么限制吗?

事实上:

  1. 是否存在任何性能问题
  2. 可以使用接口吗
  3. 有可能使用惰性吗
  4. 是否可以使用"自动属性"

我不知道属性是如何工作的,所以以这样一种全局的方式使用它有点可怕。

关于

C#序列化限制

  1. 对于在内存中克隆的小型模型,通常不是
  2. 不稳定;当使用[Serializable]时,通常使用BinaryFormatter-它查看对象本身;它们实现什么接口并不重要-不使用接口
  3. 是的,原因相同,但模型中的所有类型都必须是[Serializable]
  4. 是的,出于同样的原因;注意:默认的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]吗?存储类型信息
  • 发明一个新的引用并将其存储为身份
  • 它有自定义的序列化程序吗?如果是:用那个
  • 它有哪些字段?依次访问每个并存储名称/值对