Frage

Was sind die Unterschiede zwischen noticable Google Protocol Buffers und ASN.1 (mit PER-Codierung)? Für mein Projekt ist die imporant Ausgabe die Größe der serialisierten Daten. Hat jemand getan Vergleiche alle Daten-Größe zwischen den beiden?

War es hilfreich?

Lösung

Es ist eine lange Zeit, da ich jede ASN.1 Arbeit getan haben, aber die Größe ist sehr wahrscheinlich auf die Details Ihrer Art und Ist-Daten abhängig zu sein.

Ich würde stark wird empfohlen, beide Prototypen und einige echte Daten setzen in vergleichen.

Wenn Ihr Protokollpuffer Urtyp wiederholt enthalten würde, sollten Sie spätestens Quelle in Subversion für Protocol Buffers finden - sie können nun in einem „verpackt“ Format dargestellt werden, die viel platzsparender ist. (Mein C # Port hat nur mit dieser Funktion einige Zeit letzte Woche gefangen.)

Andere Tipps

Wenn Sie ASN.1 mit Unaligned PRO verwenden und Ihre Datentypen definieren die entsprechenden Einschränkungen (zB unter Angabe untere / obere Grenze für ganze Zahlen, obere Schranken für die Länge von Listen, etc.), werden Ihre Codierungen sehr sein kompakt. Es werden keine Bits für Dinge wie die Ausrichtung oder Polsterung zwischen den Feldern, und jedes Feld werden verschlüsselt in der minimalen Anzahl von Bits, die notwendig zu halten, seinen zulässigen Wertebereich verschwendet. Zum Beispiel kann ein Feld vom Typ INTEGER (1..8) wird in 3 Bits (1 = '000', 2 = '001', ..., 8 = '111') codiert werden; und eine Auswahl mit vier Alternativen wird 2 Bits besetzen (mit Angabe der gewählten Alternative) sowie den von der gewählten Alternative besetzten Bits. ASN.1 hat viele andere interessante Features, die erfolgreich in vielen veröffentlichten Standards verwendet wurden. Ein Beispiel ist die Erweiterung Marker ( „...“), die, wenn sie auf SEQUENCE angewandt, Auswahl, aufgezählt und andere Arten, ermöglicht rückwärts- und Abwärtskompatibilität zwischen den Endpunkten verschiedene Versionen der Spezifikation zu implementieren.

Wenn die Größe der gepackten / codierte Nachricht wichtig ist, sollten Sie auch die Tatsache beachten Sie, dass protobuf nicht in der Lage ist repeated Felder zu packen, die nicht von einem primitive numeric type sind, lesen Sie für weitere Informationen.

Dies ist ein Problem z.B. wenn Sie Nachrichten dieser Art haben: (Kommentar definiert tatsächlichen Wertebereich)

message P{
    required sint32 x = 1; // -0x1ffff  to  0x20000
    required sint32 y = 2; // -0x1ffff  to  0x20000
    required sint32 z = 3; // -0x319c  to   0x3200
}
message Array{
    repeated P ps = 1;
    optional uint32 somemoredata = 2;
}

Falls Sie eine Feldlänge von beispielsweise 32, als Sie in einer gepackten Nachrichtengröße von etwa 250 bis 450 Bytes mit protobuf führen würden, je nachdem, welche Werte das Array tatsächlich enthielt. Dies kann sogar zu mehr als 1000 Bytes im Fall erhöhen verwenden Sie den vollen 32-Bit-Bereich oder verwenden, falls Sie int32 statt sint32 und haben negative Werte.

Die Rohdaten Blob (unter der Annahme, dass z als int16 Wert definiert wird) nur 320 Byte verbrauchen und damit die ASN.1 Nachricht ist immer kleiner als 320 Bytes da die max-Werte sind tatsächlich nicht aber 32bit 19bit (x, y) und 15Bit (z).

Die protobuf Nachrichtengröße kann mit dieser Meldung Definition optimiert werden:

message Ps{
    repeated sint32 xs = 1 [packed=true];
    repeated sint32 ys = 2 [packed=true];
    repeated sint32 zs = 3 [packed=true];
}
message Array{
    required Ps ps = 1;
    optional uint32 somemoredata = 2;
}

, die zwischen etwa 100 Byte (alle Werte sind Nullen), 300 Byte (Werte bei Bereich max) und 500 Byte (alle Werte sind hoch 32Bit-Wert) in Nachrichtengrößen führt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top