如何为自定义类型实现xml序列化?

时间:2009-10-01 23:25:40

标签: c# .net serialization xml-serialization

我有一些类型需要序列化/反序列化并根据所选对象生成UI。用户界面也会更改对象,而我必须将其序列化以将其存储在我的应用中。

所以:

[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]

必须对对象进行序列化/反序列化,并且此数据必须是字符串。这就是为什么我认为有一个xml序列化器会更好。

哪种类型的序列化器最好?是否有任何好的例子可以为自定义类型实现这个?

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

你有几个字符串选择; xml,可以使用XmlSerializer(或DataContractSerializer完成,但对xml的控制要少得多)或JSON(JSON.net等)。

XmlSerializer的典型类看起来像:

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

(请注意,我希望上面的内容也适用于JSON.net)

由于属性,上述类在数据绑定方案等中也应该可以正常工作。

你会序列化这个:

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

但您可以自定义xml:

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

DataContractSerializer 理想情况更像是:

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