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

Tre*_*ent 9 c# xml-serialization

这是我的目标


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

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

Mar*_*ell 22

很不幸的是,不行.XmlSerializer有一些东西......刺激性.这是其中之一.选项:

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


Tho*_*que 8

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

[assembly:InternalsVisibleTo("MyAssembly.XmlSerializers")]
Run Code Online (Sandbox Code Playgroud)