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

时间:2009-11-17 20:14:07

标签: c# xml-serialization

这是我的对象


    [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()],但编译器会抱怨。任何人都有一个良好的解决方案吗?

2 个答案:

答案 0 :(得分:22)

不幸的是,没有。 XmlSerializer有一些令人恼火的事情。这是其中之一。选项:

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

答案 1 :(得分:8)

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

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