2009-07-11 1 views
3

Ich habe den folgenden Code:Benutzerdefinierte Knotennamen mit XML-Serialisierung (.NET)

public class Foo {} 

static class Program { 
    [XmlElement("foo")] // Ignored :(
    static public List<Foo> MyFoos { get; private set; } 

    public static void Main() { 
     MyFoos.Add(new Foo()); 
     MyFoos.Add(new Foo()); 

     XmlSerializer configSerializer = 
      new XmlSerializer(typeof(List<Foo>), new XmlRootAttribute("foos")); 
     using (TextWriter w = new StreamWriter("test.xml")) 
     { 
      s.Serialize(w, MyFoos); 
     } 
    } 
} 

, die die folgende XML-Datei erzeugt:

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

Was würde ich wirklich haben mag, ist die Foo Elemente, die als foo gekennzeichnet sind, stattdessen ... Ich weiß, dass dies hauptsächlich kosmetisch ist, aber es passt zu dem, was in XML allgemein als normal angesehen wird.

Antwort

10

Es sollte funktionieren, wenn Sie den Namen des Elements direkt gesetzt ...

[XmlElement(ElementName = "foo")] 

Siehe Beispiel here. Ist der Punkt, dass es statisch sein muss? Wenn ja, das ist nicht hilfreich, aber das funktioniert gut (hinzugefügt, um die Hin- und Rückfahrt pro Kommentar) ...

namespace TestSerial 
{ 
    public class Foo 
    { 
     public int Value 
     { 
      get; 
      set; 
     } 
    } 
    public class SerializeMe 
    { 
     private List<Foo> _foos = new List<Foo>(); 
     public SerializeMe() 
     { 
     } 

     [XmlElement("foo")] 
     public List<Foo> MyFoos { get { return _foos; } } 

    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var fs = new SerializeMe(); 
      fs.MyFoos.Add(new Foo() { Value = 1 }); 
      fs.MyFoos.Add(new Foo() { Value = 2 }); 

      var s = new XmlSerializer(typeof(SerializeMe), new XmlRootAttribute("foos")); 
      using (var w = new StreamWriter(@"c:\temp\test.xml")) 
      { 
       s.Serialize(w, fs); 
      } 

      using (var r = new StreamReader(@"c:\temp\test.xml")) 
      { 
       var o = s.Deserialize(r); 
       var fs2 = (SerializeMe)o; 

       fs2.MyFoos.Select(f => f.Value).ToList().ForEach(Console.WriteLine); 
      } 

      Console.ReadLine(); 
     } 
    } 
} 

EDIT: (Matthäus, OP)

Meine letzte Lösung, was ich als eine Verfeinerung der obigen betrachte war:

+1

XmlElementAttribute ist nicht für Klassendefinitionen erlaubt: Attribut 'XmlElement' ist nicht gültig für diesen Deklarationstyp. Es ist nur gültig für die Deklarationen "property, indexer, field, param, return". –

+0

Er hat es auf einem Grundstück, nicht? –

+1

Es ist eine statische Eigenschaft und wird immer ignoriert. –