【问题标题】:Why does Xml Serializer require properties to be writable?为什么 Xml Serializer 要求属性是可写的?
【发布时间】:2011-07-02 10:19:53
【问题描述】:

我有一些类型想要序列化为 xml,但这些类型具有只读属性,例如:

public List<Effect> Effects {get; private set;}

但 xml 序列化程序要求这些属性是可写的。

  1. xml 序列化器不是使用反射,所以实际上可以通过反射轻松设置这些属性,即使它们是只读的?

  2. 有没有办法解决这个问题,因为我不希望这些类型可以被人编辑,所以属性必须是只读的,但我也希望它们是 xml 可序列化的。

【问题讨论】:

  • 琼,您问题的真正答案是:“因为从 .NET 1.0 开始就是这样,并且永远不会改变。”
  • 我明白了。我只是想知道它是否有技术原因,例如“只读变量甚至不能通过反射设置”等。但由于这只是因为设计决策,我现在明白了。

标签: c# .net serialization xmlserializer


【解决方案1】:

这是不可能的,因为正如MSDN中提到的那样

XML 序列化是将对象的 public 属性和字段转换为序列格式(在本例中为 XML)以进行存储或传输的过程。

但您可以使用 DataContractSerializer。这是 Marc 对 SO 的回答的链接

Serializing private member data

更新

您可以通过保留 Auto Implemented 属性来克服这种行为,并具有以下内容:

 private List<Effect> _Effects;  

 public Effect()  
 {  
     _Effects= new List<Effects>();  
 }  

 public List<Effect> Effect
 {  
    get  
     {  
        return _Effects;         
     }  
 }  

【讨论】:

  • 谢谢,这仍然不能解释为什么只读属性是不允许的,因为我的属性也是公开的。
  • 谢谢,但是一旦这样做,它是否能够正确设置_Effects的值? (使用非自动属性)
  • @Joan:是的,但这仅适用于集合属性。对于所有其他人,他们需要读写。
猜你喜欢
  • 2013-03-05
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 2022-01-03
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
相关资源
最近更新 更多