我在 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>