3

我想在 C# 中实现一个通用的备忘录模式。它工作正常,但我使用 Serializeable() 属性对对象进行深层复制。我的实现使用泛型,所以如果有人使用它,他必须将他的类作为类型。现在来自用户的类也必须具有 Attribute Serializeable() 。使用 Serializeable() 的类有什么限制吗?

实际上:

  1. 有没有性能问题?
  2. 是否可以使用接口?
  3. 是否可以使用 inerhitence?
  4. 是否可以使用自动属性?

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

问候

4

1 回答 1

5
  1. 对于您在内存中克隆的小型模型,通常不会
  2. 无关紧要的;使用时,[Serializable]您通常使用BinaryFormatter- 查看对象本身;他们实现什么接口并不重要 -不使用接口
  3. 是的,出于同样的原因 - 但模型中的所有类型都必须是[Serializable]
  4. 是的,出于同样的原因;注意:默认BinaryFormatter实现是查看字段——它甚至不会触及属性

就个人而言,我尝试建议不要 BinaryFormatter使用 ,但这也许不是不合理的使用。然而!注意很容易不小心把多余的物体吸进模型里,一般必须通过events。请注意,最好将所有events 标记为非序列化:

[field:NonSerialized]
public event EventHandler Something;

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

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

public object Tag {get;set;} // caller-defined

应该也应该[field:NonSerialized]

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

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

除了添加一个 IL 标志外,它什么都不做,上面写着“顺便说一下,认为这可以被序列化”;实际上,大多数序列化程序甚至都不看这个标志- 但BinaryFormatter它是少数几个这个标志的人之一。这里的真正代码是BinaryFormatter,它基本上是:

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