2015-10-23 30 views
0

我試圖序列化對象到XML應該產生這樣的一個XML文檔:XML序列化不能導出列表正確

<?xml version="1.0" encoding="UTF-8"?> 
<XMLFile xmlns="http://www.google.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <channels> 
    <Ch01> 
    <Name>Test Channel 01</Name> 
    <Number>1</Number> 
    </Ch01> 
    <Ch02> 
    <Company>Google</Company> 
    <Founded>2015-10-23T13:04:04.2048888+01:00</Founded> 
    <Founder>Some Guy</Founder> 
    </Ch02> 
    </channels> 
</XMLFile> 

不幸的是,標籤丟失,當我做了系列化,我已經花了兩個小時試圖找出它,我有一個同事看,他們也難住,下面是一個副本代碼(不是我們的項目真正的東西)它有同樣的問題。

測試代碼:

 XMLFile file = new XMLFile(); 
     file.channels.Add(new Ch01() {Name = "Test Channel 01", Number = 1}); 
     file.channels.Add(new Ch02() {Company = "Google", Founded = DateTime.Now, Founder = "Some Guy"}); 
     XMLSerialize.SerializeToXml(Application.StartupPath + "//test.xml", file); 

XMLFILE:

[Serializable] 
public class XMLFile 
{ 
    public XMLFile() 
    { 

    } 

    [XmlElement(Type = typeof(Ch01))] 
    [XmlElement(Type = typeof(Ch02))] 
    public List<channel> channels = new List<channel>(); 
} 

信道:

[Serializable] 
public class channel 
{ 
    public channel() 
    { 

    } 
} 

CH01:

[Serializable] 
public class Ch01 : channel 
{ 
    public Ch01() 
    { 

    } 

    public string Name; 
    public int Number; 
} 

CH02:

[Serializable] 
public class Ch02 : channel 
{ 
    public Ch02() 
    { 

    } 

    public string Company; 
    public DateTime Founded; 
    public string Founder; 
} 

XMLSerialize來:

public static class XMLSerialize 
{ 
    public static void SerializeToXml<T>(string file, T value) 
    { 
     var serializer = new XmlSerializer(typeof(T), "http://www.google.com"); 
     using (var writer = XmlWriter.Create(file)) 
      serializer.Serialize(writer, value); 
    } 

    public static T DeserializeFromXML<T>(string file) 
    { 
     XmlSerializer deserializer = new XmlSerializer(typeof(T), "http://www.google.com"); 
     TextReader textReader = new StreamReader(file); 
     T result; 
     result = (T)deserializer.Deserialize(textReader); 
     textReader.Close(); 

     return result; 
    } 

這裏是輸出我得到:

<?xml version="1.0" encoding="UTF-8"?> 
<XMLFile xmlns="http://www.google.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Ch01> 
     <Name>Test Channel 01</Name> 
     <Number>1</Number> 
    </Ch01> 
    <Ch02> 
     <Company>Google</Company> 
     <Founded>2015-10-23T13:04:04.2048888+01:00</Founded> 
     <Founder>Some Guy</Founder> 
    </Ch02> 
</XMLFile> 

這樣做是爲了將產生一個巨大的XML文件中的項目,所以手動創建通過XmlDocument不是一個好的選擇。

任何想法?

+0

當你說「的標籤丟失,」你指的是頂部的XML聲明(「<?xml version = ...」)?您向我們展示了您的預期產出 - 這可能有助於查看您的實際產出。 –

+0

對不起忘了。我已經加入了真正的輸出時,標籤丟失 –

+0

不應該'[XmlArray(「通道」)]'爲你做這個? – Icepickle

回答

0

正如你可以使用XmlArray的意見建議,但你需要指定類型的派生類以及如下圖所示:

public class XMLFile 
{ 
    public XMLFile() 
    { 

    } 

    [XmlArray("channels")] 
    [XmlArrayItem(Type = typeof(Ch01), ElementName = "Ch01")] 
    [XmlArrayItem(Type = typeof(Ch02), ElementName = "Ch02")] 
    public List<channel> channels = new List<channel>(); 
} 
+0

尼斯。我不知道[XmlArrayItem]已存在!這似乎工作,所以謝謝你:) –