1

IIS で実行されている複雑なオブジェクト レイヤー (およびここでは焦点を当てていない WCF サービス レイヤー) を使用して、アプリケーションの中間層にキャッシュ/状態保持を導入しようとしています。キャッシング アーキテクチャとして memcached/enyim に落ち着いたため、これらのオブジェクトを効率的に (速度とスペースで) シリアル化する必要があります。

オブジェクト レイヤーには、次のような線に沿って、オブジェクト間の多くのポインターと相互依存性があります。

internal class SomeObj
{
    private string attr1;
    private int attr2;
    private OtherObj otherObj;
    private List<OtherOtherObj> otherObjs;
}

internal class OtherObj
{
    //...more attributes
}

internal class OtherOtherObj
{
    // you get the idea
}

すべてのフィールドが非公開であることに注意してください。また、ほとんどのオブジェクトは内部にあり、多くのプロパティは読み取り専用 (設定なし) またはユーザーの観点から設定を使用する (つまり、オブジェクトを「ダーティ」にする) ため、リハイドレーションでは使用できません。キャッシュが必要なタイプが数十あります。

私は protobuf-net と msgpack の両方の外観が好きですが、既存のアーキテクチャ (そのままでうまく機能する) をできるだけ変更せずに、シリアル化をできるだけ速く行う必要があり、これらの両方のように見えます。オブジェクト階層のサポートが制限されています。私は DTO タイプのシリアル化をよく理解していますが、キャッシュ用にオブジェクトをシリアル化する正しい方法を計画するのは初めてです。これらのツールの 1 つを使用できますか? 組み込みの .NET バイナリを使用してコンストラクターを操作し、独自の条件で属性とオブジェクトを再設定するのに行き詰まっていますか?

編集:最後の質問を明確にするために、「コンストラクターを制御し、属性とオブジェクトを自分の条件で再設定できるように、組み込みの.NETバイナリを使用して立ち往生していますか?

4

1 に答える 1

1

msgpackについてコメントすることはできませんが、そうです。protobuf-netは、次のような、あなたが言及したすべてのことを実行できます。

  • 非公開タイプをシリアル化する
  • プライベートフィールドをシリアル化する
  • ツリーをシリアル化する
  • コンストラクター-スキップまたはユーザー提供のファクトリ(またはパラメーターなしのコンストラクター)
  • フル/サイクリックグラフをシリアル化します(影響を受けるものを参照として明示的にマークすることにより)
  • 属性の使用、またはDTOをまったく変更しないランタイム構成(率直に言って、属性の方が通常は簡単です)
  • 高速でコンパクトな出力
  • 継承のサポート

与えられた例の場合、最も簡単な「動作しますか」テストは、[ProtoContract](コンストラクタースキップの属性にオプションの設定があります)を使用して型を作成し、フィールドを[ProtoMember(n )]、たとえばn = 1,2,3、...(各タイプで一意ですが、タイプ間で一意である必要はありません)

memcached+enyimではなくRedis+BookSleeveを使用しているという事実を除けば、これはまさにStackExchangeでオブジェクトキャッシングに行っていることです。また、大きなオブジェクトに対して投機的なgzipを実行します。文字列データが大量にある場合、gzipは余分なバイトを削減するのに役立ちます。

于 2012-11-25T15:05:22.440 に答える