笔记: XML忽略 不是答案!

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

我在使用该工具的几个类中遇到了问题 IE可枚举ICollection<T>

这些的问题在于,当 XMLSerializer 序列化这些时,它将它们视为外部属性,而不是使用我们想要的属性(即与我们的那个 抽象Xml序列化器 )它来到这里并摔倒了(由于类型不匹配),几乎让我们回到了第一个方向。您不能用 Xml忽略 属性也一样,所以我们不能那样阻止它。

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

我是否需要放下对此的骄傲并接受这是不可能完成的事情? 我知道我已经有点推动并从 XmlSerializer 中获得了比预期更多的东西:)


编辑

我还应该补充一点,我目前正在框架 2 中工作。


更新

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

有帮助吗?

解决方案

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

其他提示

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

我想您可以为 IEnumerable 类型实现 IXmlSerialized 来解决此行为。但是,这意味着您必须完全控制此类型的序列化过程。一种不必弄乱 XmlReader / XmlWriter 的简单方法,您可以编写一个帮助器 xml 适配器类,其中包含所有要序列化的数据的公共 ctor 和公共读写属性,并在内部为此类型创建一个临时 XmlSerializer 对象IXmlSerialized.[读|写]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));
}
}

如果您使用这些属性:

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

其中 ProviderPatientList 继承的 List<PatientList>

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top