私は内部通信プロトコルを開発する準備ができていて、XMLまたはJSONをシリアル化メカニズムとして使用しようとしましたが、テキストモードは効率が悪く、ですから、私はバイナリのシリアル化コード化メカニズムを使用したいと考えています。しかし、私は長い間、Delphiでサポートされているクロス言語を見つけることができませんでした。バイナリコード化シリアル化メカニズムを探しています
答えて
Google Protocol BuffersおよびMessagePackは、残念ながら、現時点でデルファイへのポートはほとんどありません。
- Googleのプロトコルバッファhttp://sourceforge.net/projects/protobuf-delphi/
あなたは(messagepackは本当に簡単です)自分のために実装するために喜んでいる場合は、私はあなたが書き込み()とパース()既存のライブラリの機能をハック示唆SuperObjectのようになります。
あなたは非常にまともなライブラリを手に入れることになります。
レコードと配列のシリアル化に最適化されたバイナリ形式を実装しました。また、メモリ構造のオブジェクトを簡単にシリアル化することもできます。スピードと使用スペースに最適化されています。
これは、私たちの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;
質問はクロスランゲージソリューションです – mjn
@mjnそうです。 –
BEncode? http://www.torry.net/quicksearchd.php?String=bencode&Title=Yes
ウィキペディアはそれについて書いている::
はここDelphiソースです sourcecodesはあまりにも他の言語のためにそこにありますhttp://en.wikipedia.org/wiki/Bencode
。
Apache Thriftが[バイナリXML](http://en.wikipedia.org/wiki/Binary_XML)( '高速情報セット' など)があるが、私はすべてのを見ていないXMLのためのDelphi XEおよび2010年
- 1. GWTのRPCシリアル化メカニズムを拡張するには?
- 2. jQueryのシリアル化されていないデータをPHPでシリアル化
- 3. JSON値としてプロパティをシリアル化/逆シリアル化する
- 4. Javaはどのカプセル化メカニズムを提供していますか?
- 5. Json.netは派生型をシリアル化/逆シリアル化しますか?
- 6. データベースデータをシリアル化/シリアル化解除しますか?
- 7. 逆シリアル化の逆シリアル化
- 8. シリアル化と逆シリアル化 - ソケットプログラミング
- 9. WPF BitmapImageシリアル化/逆シリアル化
- 10. Javascript Canvasシリアル化/逆シリアル化?
- 11. GeometryDrawingシリアル化/逆シリアル化
- 12. WCFシリアル化と逆シリアル化
- 13. Android HashMapシリアル化/逆シリアル化
- 14. インスタンスのシリアル化と逆シリアル化に反応します。
- 15. ABAP - SOAP:1.027 SRT:シリアル化/逆シリアル化が失敗しました
- 16. XMLシリアル化を使用して親ノードなしでコレクションをシリアル化する
- 17. ParamConverterは初期化されていないオブジェクトをシリアル化します
- 18. バイナリコード化された10進数のデコード
- 19. $ _POST配列をシリアル化してシリアル化するのは安全ですか?
- 20. シリアル化(TextWriter、オブジェクト)とシリアル化(XmlWriter、オブジェクト)
- 21. C++でのXMLシリアル化/逆シリアル化
- 22. カレンダーのシリアル化の逆シリアル化
- 23. キャプチャ/ログWCFバインディング/シリアル化/逆シリアル化エラー
- 24. .net DateTimeシリアル化逆シリアル化のバグ
- 25. MSMQ複合オブジェクトのシリアル化/逆シリアル化
- 26. オブジェクトxmlのシリアル化/逆シリアル化
- 27. ZonedDateTimeのジャクソンのシリアル化/逆シリアル化
- 28. C#Xmlシリアル化と逆シリアル化
- 29. Drupal 8シリアル化と逆シリアル化
- 30. JSONを正しくシリアル化します
をサポートしていますDelphiの実装 – mjn
XMLとJSONがバイナリソリューションより多くのパケットをもたらす理由を詳しく説明できますか? –
圧縮されていないバイナリプロトコルは、テキストプロトコルよりも効率が悪い場合があります。テキストシリアライゼーションを圧縮して解凍しないのはなぜですか?率直に言えば、相互運用性の世界から切り離すこととプロトコルを再設計することはそれほど騒々しくないので、時期尚早の最適化のようです。 –