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 { // ... }
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]) // ... }
Einschränkungen und Überlegungen
Dieser Ansatz weist bestimmte Einschränkungen auf:
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:
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!