Heim >Backend-Entwicklung >Golang >Wie gehe ich mit dem Unmarshaling unbekannter Protobuf-Nachrichten um?
Protobuf Unmarshal: Umgang mit unbekannten Nachrichten
In Szenarien, in denen der Nachrichtentyp in einer Protobuf-Nutzlast nicht im Voraus bekannt ist, erfolgt das Unmarshaling in eine Schnittstelle Der Typ {} ist nicht möglich, da er eine Implementierung der Protobuf-Nachricht erfordert Schnittstelle.
Alternativer Ansatz
Wenn zumindest Teilinformationen zur Protobuf-Nutzlast verfügbar sind, z. B. eine Zeichenfolge oder eine Zahl, können Sie diese als Schlüssel zur Instanziierung verwenden den entsprechenden konkreten Protobuf-Typ und führen Sie dann das Unmarshaling durch.
Handhabung wirklich unbekannt Nachrichten
Wenn alle Informationen zum Nachrichtentyp fehlen, kann das Protowire-Paket verwendet werden, um begrenzte Informationen aus dem Wire-Format der Protobuf-Nutzlast zu extrahieren.
Risiken und Einschränkungen
Das Parsen unbekannter Proto-Nachrichten stellt bestimmte Probleme dar Herausforderungen:
Beispiel Implementierung
Der folgende Code bietet ein Beispiel für das Parsen eines unbekannten Protobufs Nachricht:
package main import ( "fmt" "github.com/jhump/protoreflect/desc" "github.com/jhump/protoreflect/internal/strategy" "github.com/jhump/protoreflect/protopath" ) // Field represents an individual element parsed from an unknown protobuf message. type Field struct { Tag Tag Val interface{} Length int } // Tag represents a field tag with its number and wire type. type Tag struct { Num int32 Type int } // parseUnknown parses an unknown protobuf message. func parseUnknown(b []byte, parentMsg *desc.MessageDescriptor) []Field { parser := &protowireParser{msg: parentMsg, buf: b} return parser.run() } type protowireParser struct { msg *desc.MessageDescriptor buf []byte } const wireTypeMask = 0x7 func (p *protowireParser) run() (fields []Field) { for len(p.buf) > 0 { field, l, err := protowire.ConsumeField(p.buf) if err != nil || l < 1 { log.Printf("Error parsing field: %v", err) p.buf = nil return } tag := Tag{Num: field.Tag, Type: field.WireType & wireTypeMask} var v interface{} switch field.WireType & wireTypeMask { // ... handle different wire types } fields = append(fields, Field{Tag: tag, Val: v, Length: l}) p.buf = p.buf[l:] } return fields }
Fazit
Das Parsen wirklich unbekannter Protobuf-Nachrichten ist eine komplexe Aufgabe, aber durch die Nutzung des Protowire-Pakets können Sie begrenzte Informationen extrahieren, die möglicherweise ausreichend sind für Ihr spezifisches Szenario. Denken Sie daran, dass dieser Ansatz nicht für Anwendungen in Produktionsqualität geeignet ist, bei denen eine genaue Darstellung von entscheidender Bedeutung ist.
Das obige ist der detaillierte Inhalt vonWie gehe ich mit dem Unmarshaling unbekannter Protobuf-Nachrichten um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!