Joan Venge
Joan Venge

Reputation: 331320

How to implement xml serialization for custom types?

I have some types that I want to serialize/deserialize and generate a UI based on the selected object. The UI will also change the object which in turn I will have to serialize to store it in my app.

So:

[obj_apple stored in the app] -> select obj_apple -> deserialize -> show in UI -> use the UI to change obj_apple -> deselect obj_apple -> serialize -> [obj_apple stored in the app]

The objects have to be serialized/deserialized and this data has to be string. That's why I thought having an xml serializer would be better.

Which type of serializer would be the best? And are there any good examples to implement this for custom types?

Upvotes: 2

Views: 5677

Answers (2)

Marc Gravell
Marc Gravell

Reputation: 1063704

You have a few choices for strings; xml, which can be done simply with XmlSerializer (or DataContractSerializer, but that offers much less control over the xml) or JSON (JSON.net, etc).

Typical classes for XmlSerializer would look simply like:

public class Apple {
    public string Variety {get;set;}
    public decimal Weight {get;set;}
    // etc
}

(note I would expect the above to work the JSON.net too)

The above class should also work fine in data-binding scenarios etc, thanks to the properties.

You would serialize this:

    Apple obj = new Apple { Variety = "Cox", Weight = 12.1M};
    XmlSerializer ser = new XmlSerializer(typeof(Apple));

    StringWriter sw = new StringWriter();
    ser.Serialize(sw, obj);
    string xml = sw.ToString();

    StringReader sr = new StringReader(xml);
    Apple obj2 = (Apple)ser.Deserialize(sr);

but you can customize the xml:

[XmlType("apple"), XmlRoot("apple")]
public class Apple {
    [XmlAttribute("variety")]
    public string Variety {get;set;}
    [XmlAttribute("weight")]
    public decimal Weight {get;set;}
    // etc
}

DataContractSerializer is ideally more like:

[DataContract]
public class Apple {
    [DataMember]
    public string Variety {get;set;}
    [DataMember]
    public decimal Weight {get;set;}
}

Upvotes: 1

gn22
gn22

Reputation: 2086

DataContractSerializer all day.

Upvotes: 2

Related Questions