5 votes

Recherche d'un mécanisme de sériation à encodage binaire

J'étais prêt à développer un protocole de communication interne, et j'ai essayé d'utiliser XML ou JSON comme mécanisme de sérialisation, mais le mode texte est moins efficace, et conduit à un grand volume de paquets. J'espère donc utiliser un mécanisme d'encodage de sérialisation binaire. Cependant, j'ai cherché pendant longtemps, et je n'ai pas pu trouver de mécanisme supporté par Delphi et inter-langues.

3voto

arthurprs Points 993

Tampons du protocole Google y MessagePack sont les schémas les plus efficaces, malheureusement il y a très peu de ports pour Delphi à l'heure actuelle.

Si vous êtes prêt à l'implémenter par vous-même (messagepack est vraiment simple), je vous suggère de hacker écrire() y parse() des fonctions de bibliothèques existantes comme Super objet .

Vous vous retrouverez avec une bibliothèque très décente sans trop d'efforts.

2voto

JensG Points 2645

Apache Thrift prend en charge Delphi XE et 2010.

0voto

Arnaud Bouchez Points 25855

Nous avons implémenté un format binaire optimisé pour la sérialisation des enregistrements et des tableaux. Vous pouvez également sérialiser n'importe quel objet de structure mémoire facilement. Il est optimisé pour la vitesse et l'espace utilisé.

Il fait partie de notre projet Open Source mORMot, fonctionne de Delphi 5 jusqu'à XE2. Vous n'êtes pas obligé d'utiliser l'ensemble des fonctionnalités ORM / services client-serveur du projet, mais seulement la fonction SynCommons.pas unité.

Vous pouvez alors utiliser notre SynLZ format de compression en temps réel pour rendre le contenu résultant encore plus petit.

Véase cet article de blog et le code source associé.

Il possède plus de fonctionnalités que la sérialisation (c'est-à-dire le tri, la recherche, le hachage, le découpage, l'inversion...).

Il peut être utilisé avec TFileBufferWriter/TFileBufferReader pour créer n'importe quel format personnalisé, avec un encodage de longueur variable des entiers, et quelques autres optimisations.

Par exemple, nous utilisons cette sérialisation pour stocker le fichier .map de tous les symboles dans un format binaire .mab : elle utilise un peu de TDynArray instances + SynLZ . Pour un fichier texte .map de 4,44 Mo, il crée un .mab de 378 Ko. Voir TSynMapFile.SaveToStream et autres.

Nous utilisons ce même format pour la persistance d'une liste d'objets en mémoire (cf. TSQLRestServerStaticInMemory classe dans SQLite3Commons.pas ). Par exemple, un fichier de 502 Ko People.json est stocké dans un fichier de 92 Ko People.data fichier binaire.

Juste un extrait de code :

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;

0voto

hubalu Points 341

BEncode ?

Voici la source Delphi : http://www.torry.net/quicksearchd.php?String=bencode&Title=Yes

Wikipedia en parle : http://en.wikipedia.org/wiki/Bencode

Il y a aussi des codes sources pour d'autres langues.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X