2009-11-17 89 views
8

对象XmlSerialization这是我的目标与保护的属性setter


    [Serializable()] 
    public class PersistentObject 
    { 
     public virtual int ID { 
      get { return id; } 
      protected set { id = value;} 
     } 
     ... 
    } 

当我尝试这个序列化到XML,我得到一个错误“属性或索引PersistentObject.ID不能在这种情况下,因为设定使用访问者无法访问“。如果setter不存在,它可以正常工作。我想保留这个ID作为序列化,而没有涉及ID上的[XmlIgnore()]的hacktastic解决方案。我宁愿如果我可以在setter上添加[XmlIgnore()],但编译器会抱怨。有人有好的解决方案吗?

+0

(注意我增加了一个额外的选项伸出你点击“接受“) – 2009-11-17 20:21:16

回答

20

不幸的是,没有。 XmlSerializer有一些事情是...刺激。这是其中之一。选项:

  • 使用DataContractSerializer(支持protected等,但提供完整的XML控制)
  • 注释与[XmlIgnore] - 没有错
  • 实施IXmlSerializable - 勤奋,很容易得到错误
  • 取下setter,并有一个分开protected方法设置值
  • 使用XmlSerializer构造函数,它允许您在运行时指定所有内容;大量的工作/维护,需要手动缓存串行器(否则它会创建大量的动态组件)
+1

无赖,这就是我希望避免的。谢谢 – Trent 2009-11-17 20:20:03

8

即使它并不直接回答你的问题,请注意您可以用internal二传手连载性质。要做到这一点,你需要预先生成Sgen.exe XML序列化装配,并宣布总成“朋友”用InternalsVisibleTo属性:

[assembly:InternalsVisibleTo("MyAssembly.XmlSerializers")]