2009-07-05 2 views
2

私はC/Javaライブラリの実装との互換性を保つために、特定のバイナリ形式でオブジェクト(またはストリーム)にオブジェクトの表現を読み書きする必要のあるライブラリ(C#で書かれています)を持っています。フォーマットにはかなりの量のビットパッキングとDEFLATEのバイトストリームが必要です。しかし、私のライブラリはできるだけ慣れ親しんだ.NETになるようにしたいので、可能な限り通常のバイナリシリアル化プロセスに近いAPIを提供したいと考えています。私はIFormatterインターフェイスを実装する能力を認識していますが、ビルトインシリアル化スタックの一部を再利用することができず、これを実行する価値があるのですか、それとも不必要なオーバーヘッドだけになります。言い換えれば、組み込みの.NETシリアル化のイディオムを模倣する方法は?

IFormatterとcoを実装します。

OR

だけストリームに作用する方法を "デシリアライズ"/"シリアライズ" を提供?


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

答えて

0

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

これは、特定の書式に書かなければならないので、これは役に立ちませんが、protobufとsqliteはカスタムシリアル化を行うのに適したツールです。

+0

ポインタありがとう - 私は実際には可能な拡張としてprotobufシリアル化を提供したいと考えていますが、デフォルトはこの互換フォーマットである必要があります。 –

0

私は前者をします。インターフェースにはあまり意味がありません。とにかく、 ": IFormatter"と完全な互換性を得るために必要な他のコードを追加すると、構造を模倣していてもあまり意味がありません。

+0

組み込みフォーマッタを使用していない場合は、カスタムフォーマッタの外で実行される特定のものを探す必要がありますか? (私はそれを使用していない場合は完全なシリアライゼーションスタックから余分なオーバーヘッドを追加する心配だ、あまりコードの書き込みのオーバーヘッドについて)。 –

+1

より大きな疑問は、実行されるべきことではありません:潜在的にあなたの型のコンストラクタとプロパティのセッター。 –

0

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

protocol buffers」のように、既存のオープンソースのポータブルフォーマットを考えたことがありますか?これは、Googleのデータ転送などの多くを支える高密度バイナリシリアル化形式です。バージョンはJava/C++など(コアGoogleディストリビューション)、vast range of othersなど、さまざまな言語で利用できます。特に

は、.NET、慣用的使用のため、protobuf-netXmlSerializerまたはDataContractSerializerようたくさんに見えます(実際に、それも、それは各要素の順序が含まれている場合、WCFは、属性/ XMLで純粋に作業することができます) - または使用することができます特定いるProtobufネット属性は:あなたが他の実装への移植性を保証したい場合

[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です。

+0

はい、私はprotocollバッファ、Thrift、sqlite、その他の提案されていることを認識しています。互換性のために、他の実装で規定されているバイナリ形式を使用する必要があります。私は実際にあなたの(protobuf-net)ソースを見て、どのようにシリアライゼーションを実装しているかを見てきました。この特定のケースでは、私は間違いなくバイナリの読み書きメソッドを書いています。私の質問は、そうするためにIFormatterや友人を継承する価値があるのか​​、それとも枠組みの枠組みの外で行うのかということです。 –

関連する問題