2013-01-03 5 views
6

Ich muss eine Sammlung von Elementen in Camel Gehäuse exportieren, dafür verwende ich einen Wrapper.XMLSerializer macht Groß- und Kleinschreibung in der Sammlung

Die Klasse selbst:

[XmlRoot("example")] 
public class Example 
{ 
    [XmlElement("exampleText")] 
    public string ExampleText { get; set; } 
} 

Diese serialisiert fein:

<example> 
    <exampleText>Some text</exampleText> 
</example> 

Der Wrapper:

[XmlRoot("examples")] 
public class ExampleWrapper : ICollection<Example> 
{ 
    [XmlElement("example")] 
    public List<Example> innerList; 

    //Implementation of ICollection using innerList 
} 

Dies ist jedoch die verpackten Example s aus irgendeinem Grund kapitalisiert, habe ich versucht zu überschreiben Sie es mit XmlElement, aber das scheint nicht die gewünschte Wirkung zu haben ct:

<examples> 
    <Example> 
     <exampleText>Some text</exampleText> 
    </Example> 
    <Example> 
     <exampleText>Another text</exampleText> 
    </Example> 
</examples> 

Wer kann mir sagen, was ich falsch mache oder wenn es einen einfacheren Weg gibt?

+0

Sie könnten den Typ 'Example' immer in' example' umbenennen als eine Arbeitsumgebung ... Wenn Sie die Konventionen brechen können ... – RichardTowers

Antwort

5

Das Problem ist, dass XmlSerializer verfügt über eine integrierte in der Handhabung für Sammlungstypen, es bedeutet, dass es ignoriert alle Ihre Eigenschaften und Felder (einschließlich innerList), wenn Ihr Typ ICollection implementieren geschieht und wird es nur serialisiert seine eigenen Regeln entsprechend. Sie können jedoch den Namen des Elements anpassen es für die Kollektionsteile mit dem XmlType Attribute verwendet (im Gegensatz zu den XmlRoot Gegensatz, die Sie in Ihrem Beispiel verwendet hatten):

[XmlType("example")] 
public class Example 
{ 
    [XmlElement("exampleText")] 
    public string ExampleText { get; set; } 
} 

, dass die gewünschte Serialisierung hat.

Siehe http://msdn.microsoft.com/en-us/library/ms950721.aspx, speziell die Antwort auf die Frage "Warum sind nicht alle Eigenschaften von Sammelklassen serialisiert?"

+0

Sie sind in Ordnung, Sir! Vielen Dank. Ich habe die Implementierung von 'ICollection' zugunsten der Vererbung von' List' verworfen. Es scheint, dass 'XmlRoot' nicht benötigt wird, habe ich recht? – siebz0r

+0

Richtig, 'XmlRoot' wäre nur für' Example' erforderlich, wenn Sie das als Wurzel Ihres serialisierten Objektgraphen verwenden würden. – luksan

0

Leider können Sie nicht nur Attribute verwenden, um dies zu erreichen. Sie müssen auch Attributüberschreibungen verwenden. Mit Ihren Klassen von oben kann ich die XmlTypeAttribute verwenden, um die Zeichenfolgendarstellung der Klasse zu überschreiben.

var wrapper = new ExampleWrapper(); 
var textes = new[] { "Hello, Curtis", "Good-bye, Curtis" }; 
foreach(var s in textes) 
{ 
    wrapper.Add(new Example { ExampleText = s }); 
} 

XmlAttributeOverrides overrides = new XmlAttributeOverrides(); 
XmlAttributes attributes = new XmlAttributes(); 
XmlTypeAttribute typeAttr = new XmlTypeAttribute(); 
typeAttr.TypeName = "example"; 
attributes.XmlType = typeAttr; 
overrides.Add(typeof(Example), attributes); 

XmlSerializer serializer = new XmlSerializer(typeof(ExampleWrapper), overrides); 
using(System.IO.StringWriter writer = new System.IO.StringWriter()) 
{ 
    serializer.Serialize(writer, wrapper); 
    Console.WriteLine(writer.GetStringBuilder().ToString()); 
} 

Dies gibt

<examples> 
    <example> 
    <exampleText>Hello, Curtis</exampleText> 
    </example> 
    <example> 
    <exampleText>Good-bye, Curtis</exampleText> 
    </example> 
</examples> 

die ich glaube, man wollte.

Verwandte Themen