2010-09-02 88 views
2

我有一個類:簡單的C#XML序列化

public class Car { 

    public string Model {get;set;} 

    public string SeatFinish {get;set;} 

    public string Audio {get;set;} 
} 

我想使用XML序列化屬性,它序列化到下面的XML

<Car> 
    <Model>name</Model> 
    <Options> 
    <SeatFinish>Leather</SeatFinish> 
    <Audio>5 speaker</Audio> 
    </Options> 
</Car> 

對於具體的項目,我不能只創建原因一個屬性:

public List<string> Options; 

有沒有一種方法來指定通過屬性的屬性是ser在某個xml元素下ialis(在這種情況下是一個「選項」節點)?我可以寫一個允許這個的自定義屬性嗎?任何意見讚賞。

編輯:

我看到有一個選項類工作,但在那裏好歹不會產生其他類達致這?例如,我可能想只用一個屬性來做到這一點。

理想我想能夠指定

[Parent("Options")] 
public string SeatFinish {get;set;} 

回答

5

是域模型或類似的一部分?這聽起來像是你希望這些選項可以在汽車對象外重新使用,所以爲什麼不創建一個單獨的選項類?

public class Options 
{ 
    public string SeatFinish {get;set;} 
    public string Audio {get;set;} 
} 

,改變你的Car類來保存Options類:

public class Car 
{ 
    public string Model {get;set;} 
    public Options Options {get;set;} 
} 
+0

我看到這會工作,但有沒有做這個而不創建一個選項類呢? – GreyCloud 2010-09-02 09:55:50

+0

我從來沒有遇到過使用屬性來完成它的方法。 – GenericTypeTea 2010-09-02 10:05:50

3

如果可能的話,請嘗試更改類這樣的:

public class Car { 

    public class CarOptions 
    { 
     public string SeatFinish { get; set; } 
     public string Audio { get; set; } 
    } 

    public string Model { get; set; } 
    public CarOptions Options { get; set; } 

    public Car() 
    { 
     this.Options = new CarOptions(); 
    } 
} 
+0

'專用集合;'與反序列化不兼容。 – Ani 2010-09-02 09:52:24

+1

@Ani哎呀,你說得很對。習慣的力量。 – Codesleuth 2010-09-02 10:12:07

1

我相信得到你想要的,你是什麼將需要實現IXmlSerializable並自己序列化對象。

參見:Custom XML Serialization

首先實現的接口:

public class Car : IXmlSerializable 
{ 
    // Private state 
    public string Model { get; set; } 
    public string SeatFinish { get; set; } 
    public string Audio { get; set; } 

    public Car() 
    { 
     Model = "Toyota"; 
     SeatFinish = "Leather"; 
     Audio = "Awesome Soundz"; 
    } 

...

然後實現您的自定義序列化。 XmlWriter類下有很多方法可以快速且巧妙地創建XML,但爲了簡單起見,我在此使用了WriteRaw()。

public void WriteXml(XmlWriter writer) 
    { 
     writer.WriteRaw("<Model>" + this.Model + "</Model>"); 
     writer.WriteRaw("<Options>"); 
     writer.WriteRaw("<SeatFinish>" + this.SeatFinish + "</SeatFinish>"); 
     writer.WriteRaw("<Audio>" + this.Audio + "</Audio>"); 
     writer.WriteRaw("</Options>"); 
    } 

    public void ReadXml(XmlReader reader) { ... } 
} 

然後實現相應的ReadXml()方法來反序列化您的XML對象表示。我建議使用System.Xml.XPath.XPathNavigator類來簡化XML反序列化的工作,但無論如何,XMLReader類中有很多普通的舊方法,您可能會爲某個人爲的例子工作。

+0

似乎你應該幾乎不需要訴諸WriteRaw。您在這裏沒有正確地逃避任何事情,並且最終會生成無效的XML。 – Mark 2010-11-24 19:10:18

1

我認爲你使用的是默認的XML序列化機制。在這種情況下,請看IXmlSerializable Interface。它允許在現有的XML序列化機制中添加序列化鉤子。然後,您可以修改XML表示而不觸及現有的對象模型。

0

看看以前的帖子。

C# Serialization XML

相信什麼GenericTypeTea說是最好的混合它。

希望它有幫助。