2012-01-31 5 views
0

私は次のことを信じて:[XmlElement]属性を下位互換性を損なうことなくListメンバーに追加できますか?

[XmlElement("Vector3")] 
public List<Vector3> Vectors; 

:私は、私はこのように行うことができると信じて包むタグを削除したい

<Vectors> 
<Vector3> 
    <X>0</X> 
    <Y>0</Y> 
    <Z>0</Z> 
</Vector3> 
</Vectors> 

public List<Vector3> Vectors; 

はに出てシリアライズされます次のようにシリアル化する必要があります。

<Vector3> 
    <X>0</X> 
    <Y>0</Y> 
    <Z>0</Z> 
</Vector3> 

しかし、リストの周りに "Vectors"タグを使用している古いXMLファイルが壊れてしまうのではないかと心配です。これを解決する共通の方法はありますか?

EDIT:フルXMLは

<Container> 

で始まり、

</Container> 

で終わるかもしれないので、上記のリストには、コンテナオブジェクトの一部である私が質問を保つために、元々のことを除外短く

+0

下位互換性の他に、単一のVecotr3要素が本質的に多値構造であるList のようなものを表現する方法をどう思いますか?単一のXMLElementでXMLの要素が1つ以上あるベクトルをどのように表現しますか? –

+0

複数の要素がある場合、各要素はの値の値のように表示され、XMLで指定された順序はデシリアライズ時にリストに表示される順序になります。 –

+0

は有効なXMLではありません。 XMLは単一のルート要素を持たなければならず、その理由はが使用されます。 –

答えて

1

XMLにバージョン管理の仕組みが組み込まれているとは思いません。私はあなたの最善の策は、あなたが定義した "バージョン"を検出し、古いバージョンをあなたの新しいオブジェクトに手作業でデシリアライズすることができるいくつかの外部メカニズムを書くことになると思います。 2回目にスキーマを変更すると、心配する3つのバージョンがあるため、同じ問題を再度実行する場合に備えて、オブジェクトと直列化する新しいバージョンのメンバ変数またはプロパティを定義することもできます。

オブジェクトにIXmlSerializableを定義し、readXml/writeXml関数を定義することによってカスタムdeserializeメソッドを作成することも、外部プロセスを使用して古いバージョンに基づいて新しいXMLフォーマットを生成することもできます。おそらくXMLファイルをXmlDocumentにロードしてから、必要な方法で修正する(つまり、Vector3ノードをレベルに移動してVectorsノードを削除する)。次に、ドキュメントのOuterXml値を文字列に保存し、MemoryStream経由で逆シリアル化する。

関連する問題