2009-03-26 13 views
4

Does the order of fields in C# matter?で説明したように、直列化可能なプロパティの順序は、とりわけXmlSerializerの出力に影響します。C#の部分クラスのXMLシリアル化順序を制御するものは何ですか?

フィールドが2つのファイル(部分クラスを使用)にある場合、実際に結果の順序を制御するものは誰でも知っていますか?つまり、どのファイルのプロパティが最初に来るのですか?

(背景:私は2つのファイルの1つがxsdから自動生成され、もう1つが手動で編集されるシナリオに遭遇したのでこれを尋ねます。おそらくこれは2つの環境におけるxsd-> C#ステップのタイミングと履歴のいくつかの相違の副作用であると思われますが、いろいろな修正方法がありますが、可能であればコンパイルプロセスを少しは理解したいと思います。)

答えて

2

C#仕様では何も保証されていません。

+0

ありがとうMehrdad。自分の所見に基づいて答えを少し広げます。 1.あなたの言うとおり、注文は保証されません。 2. VS 2008では、順序付けは少なくとも部分的にファイル名の並べ替え順序の関数です。つまり、ファイルの名前を変更すると、順序に影響する可能性があります。 -Eric –

2

私は、[Serializable]とマークすることによってオブジェクトを作成する「簡単な」アプローチを使用すると、通常は非常に簡単な実装で十分であることがわかりました。

IXmlSerializableインターフェイスを実装することをお勧めします。このインターフェイスはかなり簡単で、必要なすべてのコントロールを提供します。ここで

+0

私たちは、多かれ少なかれわれわれが見つけた場所でそれを行います。 この場合、コード管理の容易さの利点は、絶対制御の必要性を上回っています。可能であれば、.xsdをソースとして扱い、xsd.exeを使用してxsd.exeを使用してC#をビルド前のステップとして自動生成し、必要に応じて部分クラスを拡張します) この場合最終的に選択した「修正」私たちの拡張を含むファイルの名前をpartialクラスに変更するだけでした。 –

1

は、我々は厄介なバグの修正を通って見つけたものです:

我々は正確に同じ問題を抱えていた、私たちの直列化順序は、直列化関連のクラスのいずれかを変更することなくリリース後に変更されました。

私たちはxsd-sから生成されたクラスの半分を持っていました。もう半分は手作りでした。注文属性は効果がありませんでした。私たちが見たのは、リリース前に、手作りの部分部分が最初にシリアル化され、その後に順序が変更されたということでした。

解決策は、2つのクラスを含むのプロジェクトファイル内のファイルの順番がです。シリアライザは、MSBuild(ビルドサーバー上)ビルド後に、シリアライザは先に(csproj内の) ".cs"ファイルの要素をシリアル化されたXMLに配置することが判明しました。 csproj内の ".cs"ファイルの順序を変更すると、順序が入れ替えられ、生成された部分はXMLの必要に応じて先頭になりました。

これは、ファイルの名前を変更するとcsprojのアイテムに名前が変更されるため(通常はアルファベット順)、上記のEric Hirstの回答と観測結果に揃っています。このような理由でcsprojを手動で編集することにも注意してください。

関連する問題