1

次の形式のデータがあると仮定します

Customer1
 Name
 Address
 Order1
  ID
  Products
   Product1
    ID
   Product2
    ID
Customer2
 ...

次のクラスを使用してそれを表します

class Customer
{
 public String name { get; set; }
 public String Address {get; set;}
 public List<OrderInfo> Orders { get; set; }
} 

class Order
{
 public int ID { get; set; }
 public List<Product> Products { get; set; }
}

class Product
{
 public int ID { get; set; }
}

エンティティ フレームワークと SQL を使用する代わりに、XML シリアライゼーションを使用してデータを読み書きしたいと考えています。エンティティ フレームワークを使用すると、多対 1 の関係を定義して、各製品がデータベースに 1 回だけ格納され、各注文がそれを参照するだけになるようにすることができます。上記のコードを XML シリアライゼーションで使用すると、(メモリと XML ファイルの両方に) 各製品のコピーが多数保存されることが理解できます。

これを修正するには、製品自体の代わりに製品 ID のリストを保存してから、「製品」の別のコレクションを別の XML ファイルにシリアル化することができますが、それはクリーンなソリューションとは思えません。

別のアイデアは、顧客と製品のリストを含む RepositoryClass を持つことです。その後、顧客はproductIDを保存するだけで済み、レポから「顧客」を要求すると、上記のオブジェクトの検索と構築が処理されるため、残りのコードはデータがどのように保存されたかを心配する必要がありません. それはより良い解決策のように聞こえますか?どのようにしますか?

ソリューションのもう1つの要件は、ソリューションをGUIに接続してプロパティを直接編集することをできるだけ簡単にしたいということです(実際には、バインドできる1つのXMLファイルにすべてを保存する方法が必要です) WPF ウィンドウ)。

ご意見やアドバイスをお寄せいただきありがとうございます。

4

2 に答える 2

1

特定の製品を一度インスタンス化し、それ以降その製品を参照できるため、メモリにコピーが保存されることはありません。

xml の場合はもう少し複雑です。xml 仕様にはこれに対する解決策がありますが、.NET フレームワークがこれをどの程度サポートしているかはわかりません。次のような xml ドキュメントを作成できます。

<rootElement>
    <Customers>
        <Customer ...>
            <Order>
                <ProductRef ref="1" />
                <ProductRef ref="2" />
            </Order>
        </Customer>
    </Customers>
    <Products>
        <Product id="1" />
        <Product id="2" />
        <Product id="3" />
        <Product id="4" />
    </Products>
</rootElement>

検証 XML パーサーはid、 がドキュメント内で一意であること、および各ref属性が実際に を参照していることを検証しidます (これを必要とする DTD または XML スキーマを指定した場合)。

もちろん、この構造を解析するものを作成する必要がありますが、xml データが重複することはありません。

于 2010-10-25T18:30:44.870 に答える
0

.NET の DataContractDeserializer には、preserveObjectReferences というコンストラクター引数があります。この引数が true (デフォルトは false) に設定されている場合、オブジェクトの ID は保持されます。詳細情報: http://msdn.microsoft.com/en-us/library/ms731073.aspx

于 2012-02-19T15:27:03.737 に答える