1

我在 VB.NET 的遗留系统中工作。它通过使用 XMLSerializer 并传入一个对象将数据存储在本地 XML 文件中。为了读取数据,它以相同的方式反序列化回对象。

我们没有明确的模式或 XML 命名空间。我知道这远非理想,而且我知道如果我们更改任何属性的名称或顺序,那么我们就会破坏向后兼容性。但是我们被这个基本系统和它必须能够读写的许多现有文件所困。

我没有触及被序列化对象的任何属性。但我确实开始在应用程序的另一部分使用 System.Drawing.Point。现在,当我尝试序列化或反序列化时,我收到 InvalidOperationException 并显示以下消息:

类型“System.Windows.Point”和“System.Drawing.Point”都使用命名空间“”中的 XML 类型名称“Point”。使用 XML 属性为类型指定唯一的 XML 名称和/或命名空间。

我承认我不明白系统如何突然决定这种类型是模棱两可的。引发错误的类的属性被明确声明为 System.Windows.Point。任何其他点的实例都没有被序列化或反序列化。

我已经对这个异常进行了大量搜索,但我看到的所有讨论似乎都与 Web 服务和开发人员命名的类有关。答案似乎是“重命名您的类”或“使用 XML 属性为您的类型指定新的 XML 命名空间”。

我想我不能做这两件事。我无法重命名 System.Windows.Point。我无法更改系统期望写入或读取的任何标签,因为我无法破坏与过去写入的任何文件的向后兼容性。

当我没有做任何事情来更改 XML 时,这个错误是如何开始出现的?以及如何在不破坏我访问大量现有 XML 文件的能力的情况下修复它?

编辑:XML 文件本身在任何地方都没有引用“点”。XML 如下所示:

<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Segment>
        <ID>0</ID>
        <Location>
            <X>37</X>
            <Y>330</Y>
        </Location>
        (other properties)
    </Segment>
    <Segment>
    .....
</MyClass>
4

1 回答 1

1

解决了。

事实证明,写入 XML 的内容确实发生了变化。一个很少实例化的小对象在没有进一步指定类型的情况下将成员声明为“Point”,并且编译器默认使用 System.Windows.Point。当我开始引用 System.Drawing 时,该属性默默地发生了变化,因此它使用的是 Drawing.Point。(我不知道为什么编译器没有开始抱怨这是一个模棱两可的类型名称。)

无论如何,当序列化程序尝试编写 Drawing.Point 类型的属性时,在已经编写了 Windows.Point 类型的属性之后,它实现了名称冲突并被排除。

解决方案是将两个属性显式键入到同一事物中。

于 2013-10-22T05:35:06.683 回答