データベース オブジェクトの一部を XML ファイルとの間でシリアライズ可能にする方法を見つけようとしています。
オブジェクトに Entity Framework データ モデルを使用し、WCF RIA サービスを使用してクライアントがそれらを利用できるようにしています。データベースから特定のオブジェクトを取得し、それを XML ファイルにシリアライズしたり、その逆を実行したりしたいと考えています。
過去に私はこれを試しましたが、私が遭遇した問題は次のとおりです。
オブジェクトごとに IXmlSerializable を実装すると、逆シリアル化の時点で、各オブジェクトは逆シリアル化されている他のオブジェクトを認識しません。これは一種のバブルであり、外部キー ID をオブジェクト参照に解決する方法がありません。
上記の問題について、私が見つけた唯一の解決策は、親オブジェクトが参照を追跡し、必要に応じてそれらを割り当てる、1 つの大きなシリアル化および逆シリアル化メソッドを作成することでした。各オブジェクトが独自のシリアル化を担当するのではなく、オブジェクトが変更されるたびにこの大きなメソッドを常に維持する必要があるため、これは非常に悪い方法のように感じます。
オブジェクトを相互にネストする標準的な XML 設計は、ORM モデルではうまく機能しません。その理由は、一部のオブジェクトが他の複数のオブジェクトへの参照を持ち、それらによって使用される可能性があるためです。そのため、それらのオブジェクトを親オブジェクトのサブ要素として作成することはできません。
次の XML を検討してください。
<User Name="John Smith">
<FavoriteMovies>
<Movie Name="The Big Lebowski" Year="1998" ... />
</FavoriteMovies>
</User>
<User Name="Robert Jones">
<FavoriteMovies>
<Movie Name="The Big Lebowski" Year="1998" ... />
</FavoriteMovies>
</User>
明らかに、同じ映画の 2 つのインスタンスを持つべきではありません。むしろ、シリアル化は次のようになります。
<User Name="John Smith">
<FavoriteMovies>
<Id>5</Id>
</FavoriteMovies>
</User>
<User Name="Robert Jones">
<FavoriteMovies>
<Id>5</Id>
</FavoriteMovies>
</User>
<Movies>
<Movie Id="5" Name="The Big Lebowski" Year="1998" ... />
</Movies>
WCF は、オブジェクトを SOAP/JSON/etc にシリアル化および逆シリアル化する方法を既に知っています。データ サービスを使用します。XMLファイルにシリアル化するときに再利用できるものですか?
多くの場合、オブジェクトにはデフォルトの ID があるため、データベースの外部キー ID に依存することはおそらく機能しないと思います。WCF は、これらの設定に依存せずにオブジェクトをシリアル化することを管理し、ID は、SQL データベースに保存された後にのみ割り当てられます。