【问题标题】:What generic collections in C# are IXmlSerializable?C# 中的哪些泛型集合是 IXmlSerializable?
【发布时间】:2010-10-03 08:31:10
【问题描述】:

是否有任何 .NET 通用集合标记为 IXmlSerializable?我已经尝试过 List 和 Collection 但都没有开箱即用。

在我推出自己的 collection、list 或 dictionary 类之前,我想我会检查一下 Microsoft 是否已经包含了可以做到这一点的东西。这似乎是基本功能。

编辑:“滚动我自己的”是指创建一个继承自通用集合类并实现 IXmlSerializable 的类。这是一个示例:http://www.codeproject.com/KB/XML/IXmlSerializable.aspx。这是另一个例子:http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx

我在签名如下所示的方法中使用 DataContractSerializer:

public static Stream GetXmlStream(IXmlSerializable item)

问题在于,虽然 .NET 框架中有许多可序列化的类,但并非所有类都明确实现了 IXmlSerializable 接口。

【问题讨论】:

    标签: c# generics serialization collections


    【解决方案1】:

    据我所知,没有。不过,您可以查看随附的链接。我想你会发现它很有用。

    Serialize and deserialize objects as Xml using generic types in C# 2.0

    【讨论】:

    • 您链接到的这篇文章展示了如何使用泛型来执行序列化。我想要一个可以序列化的通用集合。
    【解决方案2】:

    经过我自己的进一步研究,我得出了同样的结论。从 .NET 3.5 SP1 开始,所有 .NET 通用集合都不是 IXmlSerializable。

    【讨论】:

      【解决方案3】:

      没有要求将 IXmlSerializable 实现为 xml 可序列化。

      public class Foo 
      {
          public List<string> Names { get; set; }
      }
      

      将 xml 序列化就好了,产生类似的东西:

      <?xml version="1.0" encoding="utf-16"?>
      <Foo 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <Names>
          <string>a</string>
          <string>b</string>
          <string>c</string>
        </Names>
      </Foo>
      

      public class Foo<T> 
      {
          public List<T> Names {  get; set; }
      }
      

      会产生

      <?xml version="1.0" encoding="utf-16"?>
      <FooOfString 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <Names>
          <string>a</string>
          <string>b</string>
          <string>c</string>
        </Names>
      </FooOfString>
      

      【讨论】:

        【解决方案4】:

        与您的问题有关,如果您想序列化/反序列化 IDictionary,请参阅this useful post。不过,我会使用here 显示的模式作为您的读写方法,因为它们可以更好地处理不同的情况。

        【讨论】:

        • 这是一个很棒的链接。我最终做了一些非常相似的事情。 +1
        • 另见我添加的第二个链接。我对第一个代码有一些问题,特别是如果集合是空的......
        猜你喜欢
        • 2015-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-19
        相关资源
        最近更新 更多