C# でオブジェクト グラフをデシリアライズしたいのですが、グラフ内のオブジェクトにはオブジェクト プロパティとコレクション プロパティがあり、一部のプロパティはプライベートである可能性がありますが、循環オブジェクト参照について心配する必要はありません。私の意図は、アプリケーションが構築されているときに、デシリアライズされたオブジェクト グラフをテスト データとして使用することです。このため、オブジェクトは、シリアライズの前に XML からデシリアライズできる必要があります。XML を自由に編集して、構築されるオブジェクトを変更できるようにしたいと考えています。逆シリアル化プロセスで、オブジェクト グラフの各層に対して、ネストされたループやネストされた Linq to SQL ステートメントを必要としないようにしたいと考えています。
DataContractSerializer が不足していることがわかりました。確かに、プライベート セッターを使用してプライベート フィールドとプロパティに逆シリアル化できますが、XML 入力の処理に関しては非常に脆いようです。XML 内の要素が正しい順序になっておらず、失敗するだけです。さらに、データが宣言されると予想される順序は、クラス宣言でオブジェクトメンバーが宣言される順序と必ずしも一致しないため、オブジェクトにデータが含まれていないと、どの XML が機能するかを判断できません。それをシリアル化し、それが何を期待しているかを確認できます。
XmlSerializer は、どのタイプの非公開データにもシリアル化できないようです。
目的は、開発中に非常に単純なアプリケーションのテスト入力データを生成することであるため、Entity や Nhibernate などの重い ORM テクノロジに頼る必要はありません。
簡単な解決策はありますか?
[更新] @Chuck Savage
お返事ありがとうございます。コメントの文字数制限のため、この編集で返信します。
あなたが提案した手法では、オブジェクト階層の各層を逆シリアル化するロジックが各クラスで維持されるため、ある意味では、ネストされた Linq to SQL は、関連するさまざまなクラスに分散しているだけです。この手法では、各オブジェクトが各クラスで値を取得する XElement への参照も維持されるため、その意味では、XML のラッパーを作成するだけで、逆シリアル化はあまり行われません。私が念頭に置いているシナリオでは、アプリケーションが使用する実際のビジネス オブジェクトを逆シリアル化したいので、このような XML ラッパー タイプのオブジェクトはあまりうまく機能しません。生産使用。
私が本当に求めているのは、XmlSerializer ができることと同様のことを行うことができるものですが、プライベート フィールド (または少なくともセッターのないプロパティ) を逆シリアル化することもできます。その理由は、XmlSerializer が、関連するクラスの「通常の」運用環境への影響を最小限に抑えて実行するためです (したがって、それらの実装には影響しません)。