2012-03-30 11 views
3

私は内部通信プロトコルを開発する準備ができていて、XMLまたはJSONをシリアル化メカニズムとして使用しようとしましたが、テキストモードは効率が悪く、ですから、私はバイナリのシリアル化コード化メカニズムを使用したいと考えています。しかし、私は長い間、Delphiでサポートされているクロス言語を見つけることができませんでした。バイナリコード化シリアル化メカニズムを探しています

+0

をサポートしていますDelphiの実装 – mjn

+0

XMLとJSONがバイナリソリューションより多くのパケットをもたらす理由を詳しく説明できますか? –

+0

圧縮されていないバイナリプロトコルは、テキストプロトコルよりも効率が悪い場合があります。テキストシリアライゼーションを圧縮して解凍しないのはなぜですか?率直に言えば、相互運用性の世界から切り離すこととプロトコルを再設計することはそれほど騒々しくないので、時期尚早の最適化のようです。 –

答えて

3

Google Protocol BuffersおよびMessagePackは、残念ながら、現時点でデルファイへのポートはほとんどありません。

あなたは(messagepackは本当に簡単です)自分のために実装するために喜んでいる場合は、私はあなたが書き込み()パース()既存のライブラリの機能をハック示唆SuperObjectのようになります。

あなたは非常にまともなライブラリを手に入れることになります。

+0

Delphi、Java&C#で "it"を使う必要があります。 – Leo

+0

まあ、私の声明はこの場合有効ですが、現時点ではデルファイへのポートはありません:/ – arthurprs

+0

ありがとう@LURD答えを編集しました – arthurprs

0

レコードと配列のシリアル化に最適化されたバイナリ形式を実装しました。また、メモリ構造のオブジェクトを簡単にシリアル化することもできます。スピードと使用スペースに最適化されています。

これは、私たちのmORMotオープンソースプロジェクトの一部で、Delphi 5からXE2まで動作します。プロジェクトのORM /クライアント/サーバーサービスの機能全体を使用する必要はありません。SynCommons.pasユニットのみです。

次に、私たちのSynLZリアルタイム圧縮形式を使用して、結果のコンテンツをさらに小さくすることができます。

this blog articleと関連するソースコードを参照してください。

シリアル化(ソート、検索、ハッシュ、スライス、反転など)よりも多くの機能があります。

TFileBufferWriter/TFileBufferReaderクラスと一緒に使用して、任意のカスタムフォーマットを作成したり、整数の可変長符号化やその他の最適化を行うことができます。例えば

、我々は.mabバイナリ形式にすべてのシンボルの.MAPファイルを保存するために、この直列化を使用します。それは+ SynLZ一部TDynArrayのインスタンスを使用しています。 4.44 MBの.mapテキストファイルの場合、378 KBの.mabを作成します。 TSynMapFile.SaveToStreamなどを参照してください。

メモリ内のオブジェクトリストの永続性については、これと同じ形式が使用されます(のTSQLRestServerStaticInMemoryクラスを参照)。たとえば、502 KB People.jsonのコンテンツは、92 KB People.dataバイナリファイルに格納されます。

だけのコードスニペット:

function TSQLRestServerStaticInMemory.SaveToBinary(Stream: TStream): integer; 
var W: TFileBufferWriter; 
    MS: THeapMemoryStream; 
    IDs: TIntegerDynArray; 
    i, n, f: integer; 
begin 
    result := 0; 
    if (self=nil) or (Stream=nil) then 
    exit; 
    MS := THeapMemoryStream.Create; 
    W := TFileBufferWriter.Create(MS); 
    try 
    // primitive magic and fields signature for file type identification 
    W.Write(RawUTF8(ClassName)); 
    W.Write(StoredClassProps.SQLTableName); 
    n := Length(StoredClassProps.FieldsName); 
    W.WriteRawUTF8DynArray(StoredClassProps.FieldsName,n); 
    W.Write(pointer(StoredClassProps.FieldType),sizeof(TSQLFieldType)*n); 
    // write IDs 
    SetLength(IDs,Count); 
    with fValue do 
     for i := 0 to Count-1 do 
     IDs[i] := TSQLRecord(List[i]).fID; 
    W.WriteVarUInt32Array(IDs,Count,wkSorted); // efficient ID storage 
    // write content, grouped by field (for better compression) 
    for f := 0 to High(fStoredClassProps.Fields) do 
     with fStoredClassProps.Fields[f]^, fValue do 
     for i := 0 to Count-1 do 
      GetBinary(TSQLRecord(List[i]),W); 
    W.Flush; 
    result := StreamSynLZ(MS,Stream,TSQLRESTSERVERSTATICINMEMORY_MAGIC); 
    finally 
    W.Free; 
    MS.Free; 
    end; 
end; 
+0

質問はクロスランゲージソリューションです – mjn

+0

@mjnそうです。 –

2

Apache Thriftが[バイナリXML](http://en.wikipedia.org/wiki/Binary_XML)( '高速情報セット' など)があるが、私はすべてのを見ていないXMLのためのDelphi XEおよび2010年

関連する問題