Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

08.03.2016, 12:41

C# protobuf-net ---> Wann welchen Prefixstyle

Halloooo,

ich habe eine Frage bezüglich Googles Protobuf-net Formatters.

Wenn man mit "SerializeWithLengthePrefix" daten serialisiert, hat man ja die Option: "Prefixstyle" auf 3 verschiedenen Optionen festzulegen.
Option 1: Base128--------------> für kurze Nachrichten effizient (verstehe ich nicht, weil was ist deren Definition für "short message"^^)
Option 2: Fixed32 -----------------> (use for compatibility) -----> Was genau meint das
Option 3: Fixed32BigEndian (use for compatibility) -----> Was genau meint das

Ich habe mir einen abgegoogelt, ernsthaft, aber selbst auf der google developers seite, haben sie kaum erklärungen dazu.

Mein Issue jetzt ist, ich habe einen <T> also einen generischen Typ und welches der Prefixoptionen soll ich nun anwenden. Da ich 3 verschiedene Typen in einem Stream serialisiere brauche ich deswegen "SerializeWithLengthePrefix" (nur als nebeninfo)


Wäre euch super dankbar, was ich da machen kann!

Mfg

JP

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »JungleProgger« (08.03.2016, 13:46)


xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

2

09.03.2016, 04:36

Ich kenne die C# API nicht, aber ich denke der PrefixStyle beschreibt den Datentyp womit die Laenge der Nachricht serialisiert wird.

Fixed32(BigEndian) ist ein simpler 32 bit Integer wie er von den meisten PCs auch verwendet wird. Daher ist es sehr simpel zu lesen und schreiben.

Base128 ist ein Datentyp variabler Laenge. Kleine Zahlen brauchen weniger Speicher als grosse Zahlen.

Der Vorteil von Base128 ist, dass es fuer kleiner Zahlen kompakter ist. Du musst z.B. fuer Zahlen kleiner als 128 nur 1 Byte senden statt 4 bei Fixed32. Siehe: https://developers.google.com/protocol-b…ncoding#varints
Der Nachteil ist, dass es etwas komplexer zu (de-)serialisieren ist.

Es spricht eigentlich nichts dagegen Standardmaessig Base128 zu verwenden. Die anderen Optionen sind wie in der Dokumentation beschreiben fuer Kompabilitaetszwecke gedacht (z.B. Wenn man eine Protobuf Implementierung hat die keine Base128 Unterstuetzt). Generell wuerde ich sagen, wenn du nicht weisst ob du Fixed32 verwenden sollst, dann brauchst du es auch nicht.

3

09.03.2016, 18:46

Das liest sich jetzt so als habe es da ein Missverständnis gegeben.

Was meinst du mit "Googles Protobuf-net Formatters"? Kann es sein das du googles Protocol Buffers verwechselt hast mit protobuf-net?

Da protobuf-net nicht von google stammt ist es auch kein wunder wenn man auf der google developers seite keine infos dazu findest.

4

10.03.2016, 13:43

danke für die Antworten:

@xardias

ist denn System.String(referenztyp) auch mit Base128 kodierbar?

oder sollte man einen string lieber nicht doch mit Fixed32 dann kodieren?

Werbeanzeige