4

注意:XMLIgnore不是答案!

好的,所以继我关于XML 序列化和继承类型的问题之后,我开始将该代码集成到我正在处理的应用程序中,愚蠢地认为一切都会顺利......

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

这些问题是,当 XMLSerializer 开始序列化这些时,它将它们视为外部属性,而不是使用我们希望它的属性(即带有AbstractXmlSerializer的属性)它来到这里并跌倒(由于类型不匹配),几乎让我们回到第一方。您也不能使用XmlIgnore属性来装饰这些方法,因此我们不能以这种方式阻止它。

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

我需要吞下我对这个的骄傲并接受它做不到吗?我知道我已经推动并从 XmlSerializer 中得到了比预期更多的东西:)


编辑

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


更新

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

4

3 回答 3

4

您可以通过获取 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 来解决这个问题

于 2008-08-28T07:45:11.467 回答
3

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

我想您可以为 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));
}
}
于 2009-06-26T10:45:02.843 回答
1

如果您使用这些属性:

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

ProviderPatientList 继承的地方List<PatientList>

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

于 2008-08-28T07:59:32.897 回答