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.
Réponses
Trop de publicités?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.
- Tampons du protocole Google http://sourceforge.net/projects/protobuf-delphi/
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.
Apache Thrift prend en charge Delphi XE et 2010.
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;
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.