【问题标题】:Object XmlSerialization with protected property setters具有受保护属性设置器的对象 XmlSerialization
【发布时间】:2009-11-18 04:22:43
【问题描述】:

这是我的对象


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

当我尝试将其序列化为 xml 时,我收到一个错误 "The Property or indexer PersistentObject.ID cannot be used in this context because the set accessor is inaccessible" 。如果设置器不存在,它可以正常工作。我想将此 ID 保持为序列化,而不需要涉及 ID 上的 [XmlIgnore()] 的 hacktastic 解决方案。如果我可以仅在 setter 上添加 [XmlIgnore()],我会更喜欢,但编译器会抱怨。有人对此有好的解决方案吗?

【问题讨论】:

  • (请注意,当您单击“接受”时,我添加了一个额外的选项)

标签: c# xml-serialization


【解决方案1】:

很遗憾,没有。 XmlSerializer 有一些……令人讨厌的东西。这是其中之一。选项:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-15
      • 1970-01-01
      • 2012-02-12
      • 2018-08-08
      • 2023-03-04
      • 1970-01-01
      • 2014-02-08
      • 2011-12-12
      • 2019-10-06
      相关资源
      最近更新 更多