NickAldwin
NickAldwin

Reputation: 11744

How can I XML Serialize a Sealed Class with No Parameterless Constructor?

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.

Upvotes: 5

Views: 3770

Answers (5)

Max Toro
Max Toro

Reputation: 28608

Use IXmlSerializable, XmlSerializer is too limited.

Upvotes: 0

Marc Gravell
Marc Gravell

Reputation: 1062865

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.

Upvotes: 0

Dave Swersky
Dave Swersky

Reputation: 34810

You can implement ISerializable on the containing class, then implement a custom serializer.

Upvotes: 0

Tim Robinson
Tim Robinson

Reputation: 54734

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(); }
}

Upvotes: 12

Steve Danner
Steve Danner

Reputation: 22158

Can you make a private parameterless constructor? That will work assuming you have access to the class's code.

Upvotes: 0

Related Questions