这是我的对象
[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()],但编译器会抱怨。任何人都有一个良好的解决方案吗?
答案 0 :(得分:22)
不幸的是,没有。 XmlSerializer
有一些令人恼火的事情。这是其中之一。选项:
DataContractSerializer
(支持protected
等,但不提供完整的xml控件)[XmlIgnore]
进行注释 - 没有任何问题IXmlSerializable
- 努力工作,很容易出错protected
方法设置值XmlSerializer
构造函数,它允许您在运行时指定所有内容;大量的工作/维护,你需要手动缓存序列化程序(否则它会创建大量的动态程序集)答案 1 :(得分:8)
即使它没有直接回答您的问题,请注意您可以使用internal
setter序列化属性。为此,您需要使用Sgen.exe预生成XML序列化程序集,并使用InternalsVisibleTo
属性将该程序集声明为“friend”:
[assembly:InternalsVisibleTo("MyAssembly.XmlSerializers")]