防止 IEnumerable 和 ICollection<T> 以及继承类型的 XML 序列化

4

注意:XMLIgnore不是解决方案!

好的,继续我的问题:XML序列化和继承类型,我开始将代码集成到我正在开发的应用程序中,愚蠢地以为一切都会顺利进行。

我遇到了几个类的问题,这些类实现了IEnumerableICollection<T>

这些问题在于,当XMLSerializer来序列化这些时,它将它们视为外部属性,并且不使用我们想要的属性(即具有我们的AbstractXmlSerializer),而是跳转到此处并出现错误(由于类型不匹配),基本上使我们回到原点。您也不能使用XmlIgnore属性修饰这些方法,因此我们无法通过这种方式阻止它。

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

我需要放下自己的尊严并接受它无法完成吗?我知道我已经推动并从XmlSerializer中得到更多的东西比它所预期的要多 :)


编辑

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


更新

我已经接受了lomaxx的答案。在我的情况下,我实际上无法这样做,但我知道它可以工作。由于没有其他建议,我最终从代码中删除了接口实现。

3个回答

4
你可以通过获取System.RunTime.Serialization dll(它是一个.net 3.x程序集)并将其引用到你的.net 2.0应用程序中来解决此问题。这是可行的,因为.net 3.0二进制文件被编译为在.net 2.0 CLR上运行。
通过这样做,你可以访问DataContractSerliazer,我已经使用它来解决类似的问题,即我想将ICollection作为参数传递给webservice,但xmlserializer无法正确处理它。
如果你愿意在2.x应用程序中使用.net 3.x dll,你应该能够使用DataContractSerializer来解决这个问题。

3
我猜这个答案来得太晚,对于你特定的应用程序已经没有用处了,但也许有其他人遇到了同样的问题。
我认为你可以为IEnumerable类型实现IXmlSerializable以解决这个问题。然而,这意味着你必须完全控制此类型的序列化过程。一个简单的方法是不必处理XmlReader / XmlWriter,你可以编写一个帮助xml适配器类,其中包含所有要序列化的数据的公共构造函数和公共读写属性,并在IXmlSerializable.[Read|Write]Xml()内部创建一个临时的XmlSerializer对象来处理此类型。
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));
}
}

1
如果您使用这些属性:
        [XmlArray("ProviderPatientLists")]
        [XmlArrayItem("File")]
      public ProviderPatientList Files
    {
        get { return _ProviderPatientLists; }
        set
        {
            _ProviderPatientLists = value;
        }
    }

在编程中,ProviderPatientList继承了List<PatientList>

这样,你就可以更好地控制输出的XML内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接