2016-11-20 1 views
0

Ich leitete von List<int> ab und möchte XML mit benutzerdefinierten Namen serraize. Beispiel:Benannte XML-Serialisierung von Liste

using System; 
using System.Collections.Generic; 
using System.Xml.Serialization; 
using System.IO; 
namespace xmlerror 
{ 
    [Serializable, XmlRoot("Foo")] 
    public class Foo : List<int> 
    { 
    } 

    class MainClass 
    { 
     public static void Main(string[] args) 
     { 
      var foo = new Foo(); 
      foo.Add(123); 

      using (var writer = new StringWriter()) 
      { 
       var serilizer = new XmlSerializer(typeof(Foo)); 
       serilizer.Serialize(writer, foo); 
       Console.WriteLine(writer.ToString()); 
      }    
     } 
    } 
} 

Ausgang:

<?xml version="1.0" encoding="utf-16"?> 
<Foo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <int>123</int> 
</Foo> 

Aber ich will <Bar> statt <int> das Element nennen. Ich habe die XML-Attribute XmlAnyElement und XmlArrayItem aber zu keinem Ende versucht. Wie kann ich den Namen der Element-Tags ändern? Muss ich es manuell mit XmlTextWriter tun?

Antwort

1

Es gibt viele Möglichkeiten, dies zu tun.

Zum Beispiel können Sie IXmlSerializable Schnittstelle implementieren.

[XmlRoot("Foo")] 
public class Foo : List<int>, IXmlSerializable 
{ 
    public XmlSchema GetSchema() 
    { 
     throw new NotImplementedException(); 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     reader.ReadToFollowing("Bar"); 

     while (reader.Name == "Bar") 
      this.Add(reader.ReadElementContentAsInt()); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     foreach (var n in this) 
      writer.WriteElementString("Bar", n.ToString()); 
    } 
} 
1

Die offensichtlichste Lösung, etwas anderes als int zu verwenden.

public class Bar 
{ 
    public Bar(int value) 
    { 
     Value = value; 
    } 

    public Bar() 
    { 

    } 

    [XmlText] 
    public int Value { get; set; } 
} 

public class Foo : List<Bar> 
{ 

} 

Eine funktionierende Demoversion finden Sie unter this fiddle.

Nebenbei, das Serializable Attribut ist nicht verwandt mit XmlSerializer und kann weggelassen werden.

+0

Das funktioniert auch, aber ich entschied mich, die andere Antwort zu verwenden. – aggsol