问题
I'm currently using an XMLSerializer
to serialize a list of a class of my own. One of the class's properties is an instance of a sealed class that does not have a parameterless constructor, so the XML Serializer refuses to serialize the class. How can I get around this? I need that property to be serialized.
Is there some way for me to specify how that class should be serialized?
We'd like to stay with XML; is there another XML serializer that I could use that would not have this problem?
Again, I apologize if this is a dupe, but I had no idea what to search.
[EDIT] To clarify, I don't have access to the source of the sealed class.
回答1:
It's not possible to do directly; XmlSerializer
can't cope with classes that don't have a parameterless constructor.
What I normally do is wrap the parameterless class in another class that's compatible with XML. The wrapper class has a parameterless constructor and a set of read-write properties; it has a FromXml
method that calls the real class's constructor.
[XmlIgnore]
public SomeClass SomeProperty { get; set; }
[XmlElement("SomeProperty")]
public XmlSomeClass XmlSomeProperty
{
get { return XmlSomeClass.ToXml(SomeProperty); }
set { SomeProperty = value.FromXml(); }
}
回答2:
Can you make a private parameterless constructor? That will work assuming you have access to the class's code.
回答3:
You can implement ISerializable
on the containing class, then implement a custom serializer.
回答4:
Depending on the complexity of the xml, you might have some luck with DataContractSerializer
. This doesn't offer anything like the same level of xml control, but it bypasses the constructor completely. And works for private types.
I might also ask: does it actually need to be xml? There are other serializers for things like json or protobuf that don't have the XmlSerializer
limitations.
回答5:
Use IXmlSerializable
, XmlSerializer
is too limited.
来源:https://stackoverflow.com/questions/3559744/how-can-i-xml-serialize-a-sealed-class-with-no-parameterless-constructor