具有受保护属性设置器的对象XmlSerialization

这是我的目标

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

当我尝试将其序列化为xml时,我收到一条错误“无法在此上下文中使用属性或索引器PersistentObject.ID,因为set访问器不可访问”。 如果setter不存在,它可以正常工作。 我希望将此ID保持为序列化而不使用涉及ID上的[XmlIgnore()]的hacktastic解决方案。 我更喜欢如果我只能在setter上添加[XmlIgnore()],但编译器会抱怨。 任何人都有一个很好的解决方案吗?

很不幸的是,不行。 XmlSerializer有一些令人恼火的东西。 这是其中之一。 选项:

  • 使用DataContractSerializer (支持protected etc,但提供完整的xml控件)
  • 使用[XmlIgnore]注释 – 没有任何问题
  • 实现IXmlSerializable – 努力工作,很容易出错
  • 取下setter,并有一个单独的 protected方法来设置值
  • 使用XmlSerializer构造函数,它允许您在运行时指定所有内容; 大量的工作/维护,你需要手动缓存序列化程序(否则它会创建大量的动态程序集)

即使它没有直接回答您的问题,请注意您可以使用internal setter序列化属性。 为此,您需要使用Sgen.exe预生成XML序列化程序集,并使用InternalsVisibleTo属性将该程序集声明为“friend”:

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