Wie entmarshaliere ich unbekannte Protokollpuffer in Go?

Susan Sarandon
Freigeben: 2024-11-23 08:45:15
Original
723 Leute haben es durchsucht

How to Unmarshal Unknown Protocol Buffers in Go?

Unmarshaling unbekannter Protokollpuffer in Go

Beim Arbeiten mit Protokollpuffern (Protobuf) kann es zu Situationen kommen, in denen der Typ der empfangenen Nachricht ist unbekannt. Dies kann beim Abhören von Nachrichten aus mehreren Quellen oder beim Umgang mit dynamischen oder unvorhersehbaren Nachrichtentypen auftreten.

Die standardmäßige Unmarshal-Funktion von Protobuf erfordert die Übergabe eines bestimmten Nachrichtentyps als Argument. Dies ist jedoch bei der Nachricht nicht möglich Typ ist unbekannt. Ein gängiger Ansatz besteht darin, zu versuchen, ein Unmarshaling in eine Schnittstelle durchzuführen{}, dies wird jedoch von der Protobuf-Bibliothek nicht unterstützt.

Behebung der Einschränkung

Um unbekannte Nachrichten zu verarbeiten, Es ist notwendig, einen benutzerdefinierten Ansatz zu implementieren. Eine Lösung besteht darin, das Protowire-Paket zu verwenden, das Low-Level-Zugriff auf die Wire-Darstellung von Protobuf-Nachrichten bietet.

Unbekannte Nachrichten analysieren

Der folgende Codeausschnitt zeigt, wie das geht zum Analysieren und Extrahieren von Informationen aus unbekannten Protobuf-Nachrichten:

type Field struct {
    Tag
    Val
}

type Tag struct {
    Num int32
    Type protowire.Type
}

type Val struct {
    Payload interface{}
    Length int
}

func parseUnknown(b []byte) []Field {
    // ...
}
Nach dem Login kopieren

Die parseUnknown-Funktion Durchläuft das Byte-Array, verbraucht Felder und extrahiert grundlegende Informationen über das Tag und den Wert jedes Felds.

Nutzlast extrahieren

Die extrahierte Wertnutzlast kann in einer Vielzahl von gespeichert werden Datenstrukturen, abhängig vom erwarteten Typ und Inhalt des Feldes. Zum Beispiel:

switch t {
case protowire.VarintType:
    v, vlen := protowire.ConsumeVarint(b[taglen:fieldlen])
case protowire.Fixed64Type:
    v, vlen := protowire.ConsumeFixed64(b[taglen:fieldlen])
// ...
}
Nach dem Login kopieren

Einschränkungen und Überlegungen

Dieser Ansatz weist bestimmte Einschränkungen auf:

  • Mehrdeutigkeit: Die Drahtdarstellung von Protobuf-Nachrichten kann mehrdeutig sein, was es in einigen Fällen schwierig macht, den genauen Werttyp zu bestimmen Fälle.
  • Unbekannte Felder: Alle unbekannten oder nicht unterstützten Feldtypen werden nicht analysiert oder beibehalten.
  • Unternachrichten: Unternachrichten sind rekursiv analysiert, aber die Typinformationen gehen verloren.
  • Wiederholt Felder: Wiederholte Felder werden nicht explizit behandelt.

Alternativen zum Parsen unbekannter Nachrichten

In den meisten Szenarien ist es vorzuziehen, sich dem Problem der Unbekannten zu nähern Nachrichten aus einer anderen Perspektive, wie zum Beispiel:

  • Zuordnung zu einem Generische Nachricht: Erstellen Sie einen generischen Nachrichtentyp, der alle möglichen Felder kapseln und die unbekannte Nachricht diesem generischen Typ zuordnen kann.
  • Verwendung eines beliebigen Protos: Erwägen Sie die Verwendung des beliebigen Prototyps Kapseln Sie unbekannte Nachrichten und bewahren Sie Typinformationen für den späteren Abruf auf.

Der in diesem Artikel beschriebene Ansatz bietet eine Möglichkeit, grundlegende Nachrichten zu extrahieren Informationen aus unbekannten Protobuf-Nachrichten, sollte aber als Fallback-Lösung verwendet werden, wenn andere Optionen nicht machbar sind.

Das obige ist der detaillierte Inhalt vonWie entmarshaliere ich unbekannte Protokollpuffer in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage