我有一个定义了只读属性的类,它实际上是对一个非常可变的对象的引用,我想知道处理它的序列化的最佳方法是什么。
例如:
public class classA {
public readonly classB B = new classB();
}
public class classB {
public string Name = "Test";
}
这可以序列化为(如果不是因为“B”字段是只读的)
<classA>
<B>
<Name>Test</Name>
</B>
</classA>
但我无法反序列化它,因为序列化程序会尝试创建 classB 的新实例,并将 classA 上的字段设置为该新对象。
如果我将该属性设置为非只读,则客户端代码可能会更改所使用的 classB 实例,这是 Not Acceptable (许多其他对象将在该实例上发生沉没事件,因此它可以'不只是像这样被替换)。或者,我可以让 setter 简单地将给定对象中的值复制到已经存在的实例中,但这对于容纳序列化器来说似乎过于麻烦。
我考虑过使用一个带有setter的单独属性来处理序列化,并将其设置为[Browsable(BrowsableState.Never)],但这仍然向任何善于反射的人公开了更改实例的能力。
有没有办法告诉序列化器在反序列化时填充现有对象,或者我是否必须创建一个自定义序列化器?
最佳答案
嗯,IXmlSerialized
是一个选项,但它不是一个理想的选项;为任何不平凡的事情编写一个健壮的实现是相当困难的。
如果拥有一个不可变属性那么很重要,那么也许可以考虑拥有一个单独的 DTO 实现 - 即一组简单、用于持久性的可变类,您可以将其转换为您的域实体。
或者,其他一些序列化程序可能会有所帮助;例如,DataContractSerializer
将在私有(private)字段上工作:
[DataContract]
public class classA {
[DataMember]
private classB b = new classB();
public classB B { get {return b; } }
}
关于c# - 在 C# 中处理只读字段的 XML 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3472478/