2014-12-02 83 views
0

我很新的XML序列化/反序列化,我想知道如何應用標籤(XmlElement,XmlAttribute等)到我正在寫入XML文件的以下對象,使其最適合我以後使用LINQ或類似的工具來獲取我想要的數據。讓我舉一個例子:從我的XML獲取信息

[XmlRoot("Root")] 
    public class RootObject 
    { 
     public Services Services { get; set; } 
    } 

    public class Services 
    { 
     public Service TileMapService { get; set; } 
    } 

    public class Service 
    { 
     public string Title { get; set; } 
     public string href { get; set; } 
    } 

在這裏,我定義的一些特性,我打算寫爲XML的一些值我會在以後添加。在這一點上,我硬編碼的值這個方法:

public static void RootCapabilities() 
    { 
     RootObject ro = new RootObject() 
     { 
      Services = new Services() 
      { 
       TileMapService = new Service() 
       { 
        Title = "Title", 
        href = "http://something" 
       } 
      } 
     }; 

這讓我這個XML輸出:

<?xml version="1.0" encoding="utf-8"?> 
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Services> 
    <TileMapService> 
     <Title>Title</Title> 
     <href>http://something</href> 
    </TileMapService> 
    </Services> 
</Root> 

我的問題是,如果這是這樣做,或者如果一個有效途徑我必須使用'XmlElement'和'XmlAttribute'標記來稍後反序列化這個XML文件,並從中獲取我想要的信息(例如'title')。

我還不確定如何寫這個問題,所以請讓我知道它是否太含糊。

回答

1

如果我是你,我不會使用XML序列化。由於XML序列化作爲一種​​技術的方式,對模式/對象結構的任何更改都會立即失去向後兼容性。

將XML序列化從實際的類結構中分離出來 - 這樣,您可以對XML /對象模式進行更改,並編寫適當的遷移函數來處理您將來所做的任何更改。

而是使用LINQ-to-XML類構造XML文檔並保存它,因爲它們是.NET中以分離方式將對象結構轉換爲XML的最簡單方法。

1

如果輸出結果是你期望的,我認爲你不應該改變任何東西。

當你要更改默認的行爲,你應該用裝飾像XmlAttributeXmlIgnore(如不包括場,包括一個字段作爲一個屬性...)

它們的作用是獲得完全控制序列化和避免意外的行爲

1

如果你不想擔心序列化的本質,XmlSerializer一直對我很好。

public static void SerializeObject(T obj, string file) 
{ 
    XmlSerializer s = new XmlSerializer(typeof(T)); 
    TextWriter w = new StreamWriter(file); 
    s.Serialize(w, obj); 
    w.Close(); 
} 

public static T DeserializeObject(string file) 
{ 
    XmlSerializer s = new XmlSerializer(typeof(T)); 
    using (StreamReader r = new StreamReader(file)) 
    { 
     return (T)s.Deserialize(r); 
    } 
} 

這應該只用於引用類型雖然(對象,而不是原始類型或結構)。 Deserialize可以返回null,並將其轉換爲值類型只會帶來心痛。