2

私は次のようにクライアントサーバーアプリを持っています。

ここに画像の説明を入力してください

ドメイン内の一部のクラスには、子のコレクションがあります。一部の子供は親を参照します。

の問題は、子オブジェクトの要求がサーバーに行われると、他のすべての子が応答とともに返されることです。多くの場合、子から親オブジェクトにアクセスできると非常に役立ちます。親に対して個別のリクエストを行う必要はありません。これにより、ラウンドトリップが増えるためです。

通常、Nhibernates Lazy-Loadingがこれを処理しますが、protobuf-net(またはその他のシリアル化)との相互作用は、すべてのフィールドにアクセスしてシリアル化することを意味します。クライアントはデータベースに直接アクセスできません。

サーバーへのリクエストに2つ以上のオブジェクトをロードしないことを示すフラグを含めることができるように、protobuf-netまたはNhibernateのいずれかでオブジェクト参照の深さを制限することは可能ですか?

例:注文-注文アイテム-配送情報。

注文のリクエストが1つに制限されている場合は、配信情報を読み込まないことを意味します。0の制限は、注文アイテムをロードしないことを意味します。

あるいは、オプションで参照のロードを停止することもできます(制限は0または無制限のいずれかです)。これはより制限的ですが、実装するのがより実行可能である可能性があります。

4

2 に答える 2

2

protobuf-net は、ShouldSerialize* パターンをサポートしています (IDE/PropertyGrid や XmlSerializer を含むいくつかの BCL 実装と共通です)。

あなたが持っている場合:

[ProtoMember(1)]
public int Whatever { get; set; }

そして対応する:

public bool ShouldSerializeWhatever() {
    ...
}

次に、ShouldSerializeWhatever が true を返す場合にのみ、Whatever がシリアル化されます。このパターンは完全に名前ベースです。メソッドは公開または非公開にすることができます (ただし、XmlSerializer はこれに対して公開メソッドのみを受け入れるため、複数のシリアライザーを使用している場合は公開のままにしてください)。

于 2012-04-25T16:54:47.420 に答える
0

まず最初に、これは protobuf-net とは何の関係もありません。これは単にシリアリエであり、与えたものをシリアライズするだけなので、2 レベルの深さを与えるだけで済みます。

これは実際にはすべてロジックで行われます。あなたがやっていることは、nhibernate から出てくる実際のオブジェクトをシリアライズすることです。おそらくやりたいことは、代わりにサービスからの応答として使用されるDTO を導入し、オブジェクトから DTO にデータをコピーして、2 レベルの深さだけにできるようにすることです。

データを DTO にコピーするのは面倒な場合があり、AutoMapperのようなプロジェクトがあり、その点で生活を簡素化することを目的としていますが、2 レベルの深さしか指定できない場所へのマッピングをどの程度制御する必要があるかはわかりません。そのため、手動のマッピングが必要になる場合があります。

于 2012-04-25T15:37:24.540 に答える