1

环境使得必须在 Mono 上运行 .NET 3.5 应用程序。该应用程序不使用特殊库,而是严重依赖 XML 序列化器来加载复杂的模型。

具体我有以下情况,XML语句如下:

<compare-clause>
    <first-element />
    <second-element />
</compare-clause>

虽然第一个元素和第二个元素可以是几种不同的类型,但顺序很重要,因为它定义了哪个是左操作数,哪个是右操作数。这在 MS 上总是可以正常工作,但在 Mono(带有一些元素)上会有非常奇怪的行为。Mono 忽略分配第一个属性,将第一个元素分配给目标对象的第二个属性,并完全忽略 XML 的第二个元素。

类上的 XML 注释如下所示:

[XmlElement("first-element"), Type=typeof(FirstElementType), Order=1]
[XmlElement("second-element"), Type=typeof(SecondElementType), Order=1]
public ElementBase Left { ... }

[XmlElement("first-element"), Type=typeof(FirstElementType), Order=2]
[XmlElement("second-element"), Type=typeof(SecondElementType), Order=2]
public ElementBase Right { ... }

正如我所说,它在某些情况下不起作用,有时交换顺序会有所帮助,尽管所有类型具有相同的结构并且两个属性的注释相同,除了 Order=1,2。这一直适用于 MS .NET。如果注释上的第一个元素在第二个元素之前,则可能与此有关,尽管根据一般属性规范,这应该是完全无关的(顺序无关紧要)。

也许这仍然是 Mono XML Serialzer 的一个错误,或者我滥用了它,它只适用于 MS。尽管如此,我必须使用最新版本的 XML Serializer(2013 年 1 月)才能让应用程序正常工作!

我将不胜感激这方面的提示。此致

4

1 回答 1

0

好的,我再次仔细阅读了 MS .NET Framework 文档。似乎 XMLElementAttribute 的多个表示法仅被视为基于集合的属性的官方选项。但是,在创建序列化程序时(在 MS 和 Mono 上)没有生成正确的错误消息是一种误导。

我现在通过向对象添加 object[] 属性并在模型的官方属性上设置 XMLIgnore 来反序列化多种类型。这样,我也可以区分几种类型的元素,即使预期只有一个元素。

对那些感兴趣的人来说,为了让事情更清楚:我需要在文档层次结构的不同位置反序列化几个对象类型,这些对象类型总是通过它们的元素名称来标识。但是,标量多态属性似乎仅使用属性上指定的名称而不是类型上指定的名称进行序列化/反序列化。这意味着类型区分仅基于属性 (xsi:type) 而不是元素名称。

我已经研究过替代 XML 序列化程序库。尽管有一些选项有显着改进,但似乎都不是完全灵活或完整的,尤其是在类层次结构方面。

于 2013-05-16T06:43:08.717 回答