J'ai récemment rencontré toutes sortes de wrappers dans le package protobuf
de Google. J'ai du mal à imaginer le cas d'utilisation. Quelqu'un peut-il faire la lumière: quel problème était-il censé résoudre?
Voici l'un des liens de documentation: https://developers.google.com/protocol-buffers/docs/reference/csharp/class/google/protobuf/well-known-types/string-value ( il ne dit rien à quoi cela peut servir).
Une chose qui sera différente dans le comportement entre ceci et le type simple string
est que ce champ sera écrit moins efficacement (quelques octets supplémentaires, plus une allocation de mémoire redondante). Pour les autres wrappers, l'histoire est encore pire, car les variantes repeated
de ces champs seront écrites de manière inefficace (le sérialiseur officiel Protobuf de Google ne prend pas en charge le codage packed
pour les types non numériques).
Aucun des deux ne semble souhaitable. Alors, de quoi s'agit-il?
Il y a plusieurs raisons, principalement liées à leur utilisation - voir struct.proto .
StringValue
peut être nul, string
ne peut souvent pas être dans une langue interfacée avec des protobufs. par exemple. dans Go, les chaînes sont toujours définies; la "valeur zéro" pour une chaîne est "", la chaîne vide, il est donc impossible de faire la distinction entre "cette valeur est intentionnellement définie sur chaîne vide" et "il n'y avait pas de valeur présente". StringValue
peut être nul et résout donc ce problème. C'est particulièrement important lorsqu'ils sont utilisés dans un StructValue
, qui peut représenter un JSON arbitraire: pour ce faire, il doit faire la distinction entre une clé JSON qui a été définie sur une chaîne vide (StringValue
avec un vide chaîne) ou une clé JSON qui n'a pas été définie du tout (null StringValue
).
De plus, si vous regardez struct.proto, vous verrez que ce ne sont pas des types de message à part entière dans le proto - ils sont tous générés à partir de message Value
, qui a un oneof kind { number_value, string_value, bool_value...
etc. En utilisant un oneof
struct.proto peut représenter une variété de valeurs différentes dans un champ. Encore une fois, cela est logique compte tenu de ce que struct.proto est conçu pour gérer - JSON arbitraire - vous ne savez pas quel type de valeur une clé JSON donnée a à l'avance.
En plus de la réponse de George, vous ne pouvez pas utiliser une primitive Protobuf comme paramètre ou valeur de retour d'une procédure gRPC.