c# - 在 C# 中处理只读字段的 XML 序列化

标签 c# xml-serialization

我有一个定义了只读属性的类,它实际上是对一个非常可变的对象的引用,我想知道处理它的序列化的最佳方法是什么。

例如:

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/

相关文章:

c# - WinForms donut 和饼图标签背景元素颜色属性

c# - .net XML 序列化 : how to specify an array's root element and child element names

c# - 使用 XmlWriterSettings 和 XmlSerializer 编写 XML 片段会产生额外的字符

C# AES 加密内存使用

c# - Select N+1的NHibernate QueryOver解决方案

java - JAXB 枚举字段未序列化

c# - 如何通过 XML 序列化抑制命名空间的输出?

c# - 如何从属性中创建具有属性的元素

c# - WPF 将实际行添加到 FlowDocument

c# - Entity Framework 强制 CASE-WHEN 列不可为空