C#序列化限制

Seb*_*ebi 3 c# attributes

我想在C#中实现一般的Memento-Pattern.它运行正常但我使用Serializeable()属性来执行对象的深层复制.我使用泛型的实现,所以如果有人使用它,他必须给他的类作为类型.现在来自用户的类也必须具有Attribute Serializeable().使用Serializeable()的类是否有任何限制?

事实上:

  1. 有任何性能问题吗?
  2. 是否可以使用界面?
  3. 是否可以使用inerhitence?
  4. 是否可以使用自动属性?

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

问候

Mar*_*ell 5

  1. 对于你在内存中克隆的小型模型,通常不是
  2. 文不对题; 使用时[Serializable]你经常使用BinaryFormatter- 它看着物体本身 ; 它们实现的接口并不重要 - 不使用接口
  3. 是的,出于同样的原因 - 但模型中的所有类型必须是 [Serializable]
  4. 是的,出于同样的原因; 注意:默认BinaryFormatter实现是查看字段 - 它甚至不会触及属性

就个人而言,我试图反对 BinaryFormatter,但这可能不是一个不合理的用途.然而!注意很容易将额外的物体意外地吸入模型中,通常必须通过events.请注意,将所有events 标记为非序列化是一个好主意:

[field:NonSerialized]
public event EventHandler Something;
Run Code Online (Sandbox Code Playgroud)

(如果使用显式add/ remove访问器,则直接应用于该字段)

另请注意,任何成员都喜欢:

public object Tag {get;set;} // caller-defined
Run Code Online (Sandbox Code Playgroud)

也应该是[field:NonSerialized].

就个人而言,我更喜欢不同的序列化器,但是:这通常会起作用.我会说,尽管:尽量避免持续输出BinaryFormatter,因为很难保证代码修订版之间的兼容性.

我不知道属性是如何工作的

什么都不做,除了添加一个IL标志,"顺便说一下,考虑一下这可以序列化"; 实际上,大多数串行甚至不看这个标志 -不过BinaryFormatter是少数中的一个看这个标志.这里的真实代码BinaryFormatter基本上是这样的:

  • 我以前见过这个对象吗?如果是这样,只存储密钥
  • 它是什么类型的?是[Serializable]吗?存储类型信息
  • 发明一个新的参考并将其存储为身份
  • 它有自定义序列化器吗?如果是这样:使用它
  • 它有哪些领域?依次访问每个并存储名称/值对