2009-10-01 96 views
2

我有一些類型,我想序列化/反序列化,並基於選定的對象生成一個用戶界面。用戶界面也將改變對象,反過來,我將不得不序列化以將其存儲在我的應用程序中。如何爲自定義類型實現xml序列化?

所以:

[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序列化器會更好。

哪種類型的串行器最好?有沒有什麼好的例子來實現這個自定義類型?

+1

(回覆評論) – 2009-10-03 07:12:33

回答

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;} 
} 
+0

謝謝Marc,非常酷的例子。 – 2009-10-02 16:16:14

+0

Btw Marc,我可以使用XmlSerializer ser = new XmlSerializer(typeof(obj.GetType())); 我只是想知道在這種情況下typeof是否有優勢? – 2009-10-02 22:35:26

+1

new XmlSerializer(obj.GetType()); – 2009-10-03 07:12:03