2009-07-11 79 views
3

我有以下代码:与XML序列化(.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); 
     } 
    } 
} 

将会产生下面的XML文件:

<?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> 

我真的想拥有的是Foo元素标记为foo,相反......我意识到这主要是表面化妆,但它符合XML中通常被认为正常的东西。

回答

10

如果直接设置元素的名称应该工作...

[XmlElement(ElementName = "foo")] 

见例如here。它必须是静态的吗?如果是这样,这是没有帮助的,但是这个工作正常(每加评论往返)...

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(); 
     } 
    } 
} 

编辑:(马太福音,OP)

我的最终解决方案,我认为对上述的改进是:

public class Foo {} 

[XmlRoot("foos")] 
public class FooList 
{ 
    public FooList() { Foos = new List<Foo>(); } 
    [XmlElement("foo")] 
    public List<Foo> Foos { get; set; } 
} 

static class Program 
{ 
    static private FooList _foos = new FooList(); 
    static public List<Foo> MyFoos { get { return _foos; } } 

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

     XmlSerializer configSerializer = 
      new XmlSerializer(typeof(FooList)); 

     using (TextReader r = new StreamReader("test.xml")) 
     { 
      _foos = (FooList)configSerializer.Deserialize(r); 
     } 

     using (TextWriter w = new StreamWriter("test.xml")) 
     { 
      configSerializer.Serialize(w, _foos); 
     } 
    } 
} 
+1

XmlElementAttribute在类定义上是不允许的:属性'XmlElement'在这个声明类型上是无效的。它只对'property,indexer,field,param,return'声明有效。 – 2009-07-11 02:45:02