【问题标题】:How to avoid using the name of a custom collection class when serialized序列化时如何避免使用自定义集合类的名称
【发布时间】:2013-02-26 21:17:52
【问题描述】:

我有一个自定义集合类作为另一个类的属性,如下所示:

class MyDataClass
{
    CustomCollection<MyType> DataCollection;
}

它实现了 IXmlSerializable,所以它可以被序列化就好了。我唯一的抱怨是生成的 xml 看起来像这样:

<MyDataClass>
  <DataCollection>
    <MyType />
    <MyType />
  </DataCollection>
</MyDataClass>

当我不希望集合在 xml 中时,就像这样:

<MyDataClass>
  <MyType />
  <MyType />
</MyDataClass>

我已经读过对于列表和数组,您可以添加 [XmlElement] 属性来告诉 xml 序列化程序将集合呈现为未包装的元素列表,但这对我不起作用。

【问题讨论】:

    标签: .net xml-serialization


    【解决方案1】:

    这应该可行:

    public class MyDataClass
    {
        [XmlElement("MyType")]
        public CustomCollection<MyType> DataCollection;
    
    } 
    
    public class CustomCollection<T> : List<T> { }
    public class MyType { }
    
    public static void Main()
    {
        MyDataClass c = new MyDataClass();
        c.DataCollection = new CustomCollection<MyType>();
        c.DataCollection.Add(new MyType { });
        c.DataCollection.Add(new MyType { });
    
        XmlSerializer xsSubmit = new XmlSerializer(typeof(MyDataClass));
        StringWriter sww = new StringWriter();
        XmlWriter writer = XmlWriter.Create(sww);
        xsSubmit.Serialize(writer, c);
        var xml = sww.ToString(); // Your xml
    }
    

    生成的 xml 看起来像

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

    【讨论】:

    • 不适合我,但我注意到我的自定义集合继承自 Dictionary。这可能是它不起作用的原因吗?
    • 是的,你不能序列化一个实现 IDictionary 的类,检查这个link " XmlSerializer 不能处理实现 IDictionary 接口的类。这部分是由于调度限制,部分是由于事实散列表在 XSD 类型系统中没有对应物。唯一的解决方案是实现一个不实现 IDictionary 接口的自定义散列表。"
    猜你喜欢
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2011-11-13
    • 2011-09-22
    相关资源
    最近更新 更多