【问题标题】:Preventing XML Serialization of IEnumerable and ICollection<T> & Inherited Types防止 IEnumerable 和 ICollection<T> 和继承类型的 XML 序列化
【发布时间】:2010-09-07 02:29:43
【问题描述】:

注意:XMLIgnore 不是答案!

好的,所以继我在XML Serialization and Inherited Types 上提出的问题之后,我开始将该代码集成到我正在开发的应用程序中,愚蠢地认为一切都会顺利......

我在实现 IEnumerableICollection

的几个类中遇到了问题

这些问题在于,当 XMLSerializer 开始序列化这些时,它将它们视为一个外部属性,而不是使用我们想要的属性(即带有我们的 AbstractXmlSerializer )它来到这里并摔倒(由于类型不匹配),几乎让我们回到了原点。你也不能用 XmlIgnore 属性来装饰这些方法,所以我们不能这样阻止它。

我当前的解决方案是删除接口实现(在当前的应用程序中,这没什么大不了的,只是让代码更漂亮)。

我是否需要放弃对此的自豪并接受它无法完成?我知道我已经推动并从 XmlSerializer 中得到了比预期更多的东西:) p>


编辑

我还应该补充一点,我目前正在使用框架 2。


更新

我已接受lomaxx's answer。在我的情况下,我实际上无法做到这一点,但我知道它会起作用。由于他们没有其他建议,我最终从代码中删除了接口实现。

【问题讨论】:

    标签: xml inheritance serialization .net-2.0


    【解决方案1】:

    您可以通过获取 System.RunTime.Serialization dll(它是一个 .net 3.x 程序集)并从您的 .net 2.0 应用程序中引用它来解决这个问题。这是因为 .net 3.0 二进制文件被编译为在 .net 2.0 CLR 上运行。

    通过这样做,您可以访问 DataContractSerliazer,我用它来解决类似的问题,我想将 ICollection 作为参数传递给 web 服务,而 xmlserializer 不知道如何处理它正确。

    如果您喜欢在 2.x 应用程序中使用 .net 3.x dll,您应该能够使用 DataContractSerializer 来解决这个问题

    【讨论】:

      【解决方案2】:

      我想答案来得太晚了,对您的特定应用程序没有用处,但也许其他人也有同样的问题。

      我想您可以为 IEnumerable 类型实现 IXmlSerializable 以解决此问题。但是,这意味着您必须完全控制此类型的序列化过程。一种不必弄乱 XmlReader / XmlWriter 的简单方法,您可以编写一个具有公共 ctor 的帮助 xml 适配器类和要序列化的所有数据的公共读写属性,并在内部为这种类型创建一个临时 XmlSerializer 对象IXmlSerializable.[读取|写入]Xml().

      class Target : IEnumerable<Anything>, IXmlSerializable
      {
      //...
      
      public void ReadXml(System.Xml.XmlReader reader)
      {
          reader.ReadStartElement();
          TargetXmlAdapter toRead = (TargetXmlAdapter)new XmlSerializer(typeof(TargetXmlAdapter)).Deserialize(reader);
          reader.Read();
      
          // here: install state from TargetXmlAdapter
      }
      
      public void WriteXml(System.Xml.XmlWriter writer)
      {
          // NOTE: TargetXmlAdapter(Target) is supposed to store this' state being subject to serialization
          new XmlSerializer(typeof(TargetXmlAdapter)).Serialize(writer, new TargetXmlAdapter(this));
      }
      }
      

      【讨论】:

        【解决方案3】:

        如果你使用这些属性:

                [XmlArray("ProviderPatientLists")]
                [XmlArrayItem("File")]
              public ProviderPatientList Files
            {
                get { return _ProviderPatientLists; }
                set
                {
                    _ProviderPatientLists = value;
                }
            }
        

        ProviderPatientList 在哪里继承List&lt;PatientList&gt;

        然后您可以更好地控制输出的 xml 将创建

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-06
          • 1970-01-01
          • 1970-01-01
          • 2021-04-04
          • 2010-12-15
          • 2020-04-16
          • 1970-01-01
          相关资源
          最近更新 更多