Maison > développement back-end > Golang > le corps du texte

Comment débloquer des tampons de protocole inconnus dans Go ?

Susan Sarandon
Libérer: 2024-11-23 08:45:15
original
724 Les gens l'ont consulté

How to Unmarshal Unknown Protocol Buffers in Go?

Démarshalisation des tampons de protocole inconnus dans Go

Lorsque vous travaillez avec des tampons de protocole (protobuf), il est possible de rencontrer des situations où le type de message reçu est inconnu. Cela peut survenir lors de l'écoute de messages provenant de plusieurs sources ou lors du traitement de types de messages dynamiques ou imprévisibles.

La fonction Unmarshal par défaut de Protobuf nécessite qu'un type de message spécifique soit transmis comme argument, mais cela n'est pas réalisable lorsque le message le type est inconnu. Une approche courante consiste à tenter de désorganiser dans une interface {}, mais cela n'est pas pris en charge par la bibliothèque Protobuf.

Résoudre la limitation

Pour gérer les messages inconnus, il est nécessaire de mettre en œuvre une approche personnalisée. Une solution consiste à utiliser le package protowire, qui fournit un accès de bas niveau à la représentation filaire des messages protobuf.

Analyse des messages inconnus

L'extrait de code suivant montre comment pour analyser et extraire des informations à partir de messages protobuf inconnus :

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 {
    // ...
}
Copier après la connexion

La fonction parseUnknown parcourt le tableau d'octets, consomme les champs et extrait des informations de base sur la balise et la valeur de chaque champ.

Extraction de la charge utile

La charge utile de la valeur extraite peut être stockée dans une variété de structures de données, en fonction du type attendu et du contenu du champ. Par exemple :

switch t {
case protowire.VarintType:
    v, vlen := protowire.ConsumeVarint(b[taglen:fieldlen])
case protowire.Fixed64Type:
    v, vlen := protowire.ConsumeFixed64(b[taglen:fieldlen])
// ...
}
Copier après la connexion

Limitations et considérations

Cette approche présente certaines limites :

  • Ambiguïté : La représentation filaire des messages protobuf peut être ambiguë, ce qui rend difficile la détermination du type exact de valeur dans certains cas.
  • Champs inconnus : Tout type de champ inconnu ou non pris en charge ne sera ni analysé ni préservé.
  • Sous-messages : Les sous-messages sont analysé de manière récursive, mais les informations de type sont perdues.
  • Répété Champs : Les champs répétés ne sont pas explicitement gérés.

Alternatives à l'analyse des messages inconnus

Dans la plupart des scénarios, il est préférable d'aborder la question de l'inconnu messages d'un point de vue différent, tels que :

  • Mappage à un générique Message : Créez un type de message générique capable d'encapsuler tous les champs possibles et mappez le message inconnu à ce type générique.
  • Utilisation de Any Proto : Pensez à utiliser le type de proto Any pour encapsuler messages inconnus et conserver les informations de type pour une récupération ultérieure.

L'approche décrite dans cet article fournit un moyen d'extraire des informations de base à partir de messages inconnus. messages protobuf, mais il doit être utilisé comme solution de secours lorsque d'autres options ne sont pas réalisables.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal