问题
Here is my object
[Serializable()]
public class PersistentObject
{
public virtual int ID {
get { return id; }
protected set { id = value;}
}
...
}
When I try to serialize this to xml, I get an error "The Property or indexer PersistentObject.ID cannot be used in this context because the set accessor is inaccessible" . If the setter doesn't exist, it works fine. I want to keep this ID as serialized without a hacktastic solution that involves an of [XmlIgnore()] on ID. I would prefer if I could add [XmlIgnore()] on just the setter, but the compiler complains. Anybody have a good solution around this?
回答1:
Unfortunately, no. XmlSerializer
has some things that are... irritating. This is one of them. Options:
- use
DataContractSerializer
(which supportsprotected
etc, but doesn't offer full xml control) - annotate with
[XmlIgnore]
- nothing wrong with it - implement
IXmlSerializable
- hard work and very easy to get wrong - take off the setter, and have a separate
protected
method to set the value - use the
XmlSerializer
constructor that lets you specify everything at runtime; lots of work/maintenance, and you need to manually cache the serializer (otherwise it creates lots of dynamic assemblies)
回答2:
Even though it doesn't directly answer your question, note that you can serialize properties with an internal
setter. To do that, you need to pre-generate the XML serialization assembly with Sgen.exe, and declare that assembly as "friend" using the InternalsVisibleTo
attribute :
[assembly:InternalsVisibleTo("MyAssembly.XmlSerializers")]
来源:https://stackoverflow.com/questions/1751448/object-xmlserialization-with-protected-property-setters