2

オブジェクトの表現を特定のバイナリ形式でディスク (または任意のストリーム) に読み書きする必要があるライブラリ (C# で記述) があります (C/Java ライブラリ実装との互換性を確保するため)。この形式には、かなりの量のビット パッキングといくつかの DEFLATE されたバイトストリームが必要です。ただし、ライブラリをできるだけ慣用的な .NET にしたいので、通常のバイナリ シリアル化プロセスにできるだけ近い API を提供したいと考えています。IFormatter インターフェイスを実装できることは認識していますが、組み込みのシリアル化スタックのどの部分も再利用できないので、これを行う価値はありますか、それとも不必要なオーバーヘッドが発生するだけでしょうか。言い換えると:

IFormatter などを実装します。

また

Stream で動作する "Serialize"/"Deserialize" メソッドを提供するだけですか?


リモーティングが関係するあらゆるケースでシリアライゼーションのセマンティクスが必要であることについて、以下で取り上げた良い点です。MarshalByRef オブジェクトの使用が可能である場合、これが問題にならないことは確かです。そのため、ISerializable/IFormatter とカスタム スタックを使用する利点または欠点はありますか (または、私の理解はリモート処理が間違っている)?

4

3 に答える 3

0

前者をやります。インターフェイスにはそれほど多くはないので、とにかく構造を模倣している場合は、「: IFormatter」と完全な互換性を取得するために必要な他のコードを追加するのにそれほど時間はかかりません。

于 2009-07-05T13:11:03.030 に答える
0

私はいつも後者を使ってきました。特定のフレームワークにファイルを書き込むだけの場合、シリアル化フレームワークを再利用してもあまり意味がありません。カスタム シリアライゼーション フレームワークの使用に関して私が遭遇した唯一の問題は、オブジェクトをシリアライズ可能にする必要があるリモーティング時です。

特定の形式に書き込む必要があるため、これは役に立たないかもしれませんが、protobuf と sqlite はカスタムのシリアル化を行うための優れたツールです。

于 2009-07-05T12:46:19.273 に答える
0

独自のシリアル化コードを記述すると、エラーが発生しやすく、時間がかかります。

考えてみると、たとえば「プロトコルバッファ」など、既存のオープンソースのポータブルフォーマットを検討しましたか? これは、Google のデータ転送などの多くを支える高密度のバイナリ シリアル化形式です。バージョンは、Java/C++ など (Google のコア ディストリビューションに含まれる) など、さまざまな言語で利用できます

特に、.NET の慣用的な使用法では、protobuf-netはorによく似ています(実際、各要素に順序が含まれている場合は、xml/wcf 属性だけでも機能します) - または特定の protobuf-net 属性を使用できます。 :XmlSerializerDataContractSerializer

[ProtoContract]
class Person {
    [ProtoMember(1)]
    public string Name {get;set;}
}

他の実装への移植性を保証したい場合は、「.proto」ファイルを使用して「最初に契約」を開始することをお勧めします。この場合は次のようになります。

message person {
    required string name = 1;
}

この .proto ファイルを使用して、言語固有のバリアントを生成できます。したがって、protobuf-net を使用すると、「protogen」を介して実行できます (protobuf-net に含まれており、VS2008 アドオンが進行中です)。または Java/C++ などの場合は、「protoc」(Google の protobuf に含まれています) を介して実行します。protobuf-net の「protogen」は現在、C# と VB を発行できますが、F# などを使用する場合は、別の言語を追加するのは非常に簡単です。xslt を作成 (または移行) するだけです。

Java バージョンのより直接的なポートである別の .NET バージョンもあります。そのため、.NET の慣用性は低くなります。これはdotnet-protobufsです。

于 2009-07-05T19:30:09.533 に答える