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