1

状況により、Mono で .NET 3.5 アプリケーションを実行することが必要になりました。アプリケーションは特別なライブラリを使用しませんが、XML シリアライザーに大きく依存して複雑なモデルをロードします。

具体的には、次のような XML ステートメントがあります。

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

first-element と second-element はいくつかの異なる型にすることができますが、どちらが左オペランドでどちらが右オペランドであるかを定義するため、順序は重要です。これは MS では常に問題なく動作しますが、Mono (一部の要素を含む) では非常に奇妙な動作が発生します。Mono は最初のプロパティの割り当てを無視し、最初の要素をターゲット オブジェクトの 2 番目のプロパティに割り当て、XML の 2 番目の要素を完全に除外します。

クラスの 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 で機能します。最初の要素が注釈の 2 番目の要素の前に来る場合、おそらく何か関係があるかもしれませんが、これは一般的な属性の仕様 (順序は関係ありません) に従って完全に無関係である必要があります。

もしかしたら、これはまだ Mono XML Serialzer のバグなのかもしれませんし、私が誤用したために MS でしか動作しないのかもしれません。それでも、アプリケーションを完全に機能させるには、XML シリアライザーの最新バージョン (2013 年 1 月) を使用する必要がありました。

これに関するヒントをいただければ幸いです。よろしくお願いします

4

1 に答える 1

0

わかりました。MS .NET Framework のドキュメントをもう一度注意深く読みました。XMLElementAttribute の複数表記は、コレクションベースのプロパティの公式オプションとのみ見なされているようです。ただし、(MS と Mono の両方で) シリアライザーを作成するときに適切なエラー メッセージが生成されないのは誤解を招きます。

object[] プロパティをオブジェクトに追加し、モデルの公式プロパティに XMLIgnore を設定することで、複数の型を逆シリアル化するための回避策を作成しました。そうすれば、予想される要素が 1 つしかない場合でも、いくつかのタイプの要素を区別することもできます。

興味のある方のために、さらに明確にするために、ドキュメント階層内のさまざまな場所で、常に要素名で識別されるいくつかのオブジェクト タイプを逆シリアル化する必要がありました。ただし、スカラー ポリモーフィック プロパティは、型ではなく、プロパティで指定された名前でのみシリアル化/逆シリアル化するようです。つまり、型の識別は属性 (xsi:type) のみに基づいており、要素名には基づいていません。

別の XML シリアライザ ライブラリについては、既に調査済みです。大幅に改善されたオプションがいくつかありますが、特にクラス階層に関しては、どちらも完全に柔軟または完全ではないようです。

于 2013-05-16T06:43:08.717 に答える