2011-12-14 67 views
0

當我序列化一個對象時,有沒有辦法在XmlSerializer中添加XML根元素或「包裝器」?XmlSerializer使用默認的XmlRoot序列化

我要找的XML將是這樣的:

<Groups> 
    <Group method="ModifySubGroups" ID="1234" PIN="5678"> 
     <SubGroup action="Delete" number="95"> 
      <Name>Test</Name> 
     </SubGroup> 
    </Group> 
</Groups> 

我有兩個班,組和子組。組包含子組的一個通用列表。它工作的很好,但我沒有XML根「組」。使用兩個類組和子組產生這樣的:

<Group method="ModifySubGroups" ID="1234" PIN="5678"> 
    <SubGroup action="Delete" number="95"> 
     <Name>Test</Name> 
    </SubGroup> 
</Group> 

我能得到它的工作的唯一方法是創建一個包含組另一個階級「組」。所以現在我有三個類:Groups,Group和SubGroup。組包含Group和Group包含SubGroup。

還有其他想法嗎?

回答

4

您通常不使用XML序列化來使XML更漂亮。如果你需要一個根容器元素,那麼你需要有一個根容器對象,並且序列化它而不是Group對象。

可以然而序列Group對象

void Main() 
{ 
    var g = new Group(); 
    g.SubGroups.Add(new SubGroup {Name = "aaa"}); 

    var ser = new XmlSerializer(typeof(Group[]), new XmlRootAttribute("Groups")); 
    using (var w = new StringWriter()) 
    { 
     ser.Serialize(w, new Group[] {g}); 
     w.ToString().Dump(); 
    } 
} 

public class Group 
{ 
    [XmlElement("SubGroup")] 
    public List<SubGroup> SubGroups = new List<SubGroup>(); 
} 

public class SubGroup 
{ 
    public string Name; 
} 

的陣列自然,這意味着反序列化代碼需要或者神奇地知道,總有一個且只有一個組元素或假設,有可能是0個或多個。老實說,除非你真的想序列化組的集合,否則我並沒有看到這麼做。這隻會增加混亂。

+0

我對此沒有任何控制權。提供Web服務的供應商需要這種方式。這效果很好。謝謝! – vincentw56

+0

@ vincentw56請參閱我已編輯的答案,以防現有的模式您必須遵守 – vittore

+0

注意:可能的內存泄漏! http://msdn.microsoft。COM/RU-RU /雜誌/ cc163491.aspx – Evgeny

0

編輯:如果你真的想遵守供應商模式,你是從錯誤的觀點開始的。 您不需要實現類似這樣的類,只需要使用供應商XSD並使用隨Visual Studio提供的xsd utility從模式生成.net類,您也可以選擇想要序列化對象的方式 - 使用XmlSerializerDataContractSerializer(它給你更好的靈活性,我會說)

注意:您可以使用一些工具來生成你的XML XSD,如果你沒有一個不知道如何把它寫在自己

您可以使用XmlRootAttribute以指定自定義XML根

另外,當您序列化您可以指定包裝 - 請參閱Array Serializing

+0

當我在XmlSerializer的構造函數中這樣做時,它只是用「Groups」替換「Group」。它不會添加根元素或「包裝器」。 – vincentw56

+0

「XmlArray」和「XmlArrayItem」在根元素上不起作用。 –

+0

在這種情況下數據契約不起作用,因爲它們不支持XML屬性。 –