Définitions Protocol Buffers

Formatage Protobuf

Examinez une définition proto3 autonome sous forme d’arbre, de source mise en forme ou de structure JSON, en conservant ses numéros de champ.

Formatage Protobuf

Source proto3

Résultat

    Le code reste dans votre navigateur. Aucun import ni appel réseau n’est effectué.

    Options

    Sous-ensemble proto3 dans un seul fichier. Sans imports, options personnalisées, compilation ni contrôle de compatibilité. Modifier la source réinitialise la racine.

    Limites : 100 000 caractères UTF-16, 20 000 jetons, 2 000 déclarations, 32 niveaux ; délai de 8 secondes.

    Résultat périmé. L’export est désactivé.

    Le formatage Protobuf rend une définition compacte plus facile à relire, mais une indentation correcte ne garantit pas la validité du contrat. Un numéro réservé ou une référence inconnue peut encore s’y cacher. Les contrôles pris en charge sont donc exécutés avant de rendre les résultats exportables.

    L’arbre expose les noms du fichier et les chemins complets des types. Le JSON Schema décrit, lui, une forme de données pour le message choisi. Gardez la définition d’origine pour les services, les réservations historiques et les comportements que cette projection ne représente pas.

    Pourquoi utiliser le formatage Protobuf ici ?

    Distinguer des types qui portent le même nom

    Le formatage Protobuf conserve l’ordre des déclarations. Les références utilisent des noms complets : OuterA.Item et OuterB.Item restent deux types distincts. Une référence récursive apparaît comme un chemin, sans ouvrir une nouvelle branche à l’infini.

    Un document source relié à un arbre où les messages imbriqués restent distincts.

    Choisir la forme de données à examiner

    Un fichier peut contenir plusieurs messages. Le choix de la racine modifie le $ref principal, tandis que les définitions partagées restent dans $defs. Vous pouvez ainsi examiner les listes, les maps et les coordonnées mutuellement exclusives avant de les utiliser dans une intégration.

    Deux types imbriqués de forme proche conduisent à deux définitions de schéma séparées.

    Trois repères pour relire une définition

    01

    Identifier le véritable message racine

    Le premier message du fichier est sélectionné par défaut. Un paquet, une énumération ou un service ne devient pas la racine. Choisissez un autre nom complet dans les options. Modifier la source réinitialise ce choix afin de ne pas conserver une référence à un type supprimé.

    02

    Parcourir sans modifier la sortie

    Développez les déclarations et revenez au code par leur numéro de ligne. L’arbre affiche les entrées visibles par lots de 50. L’export de structure contient toutes les déclarations, y compris celles qui sont repliées ou pas encore affichées ; le parcours n’altère pas le contrat.

    03

    Attendre un résultat à jour

    La vérification automatique attend 350 ms après une modification. La désactiver fait apparaître le bouton principal et permet Ctrl/Cmd + Enter. Les exports périmés sont bloqués immédiatement. Exemple et Vider présentent un aperçu ; le retour à la version précédente restaure source et résultat.

    De la déclaration à la forme JSON

    Un formateur Protocol Buffers qui garde les tags

    L’indentation peut utiliser deux ou quatre espaces. Les commentaires et le contenu des chaînes restent intacts, même avec des accolades ou des points-virgules. Le nom, le numéro et l’ordre des champs sont conservés. La sortie est analysée une seconde fois pour comparer son descripteur à celui du fichier initial.

    Validation de syntaxe et numéros de champ

    Les tags doivent être positifs, uniques dans un message et hors de la plage 19000–19999. Les réservations sont contrôlées même si elles suivent les champs. Une énumération proto3 commence par zéro ; les alias numériques nécessitent allow_alias. Ces vérifications concernent le fichier actuel, pas les anciennes versions du protocole.

    Références résolues dans le même fichier

    L’arbre contient paquets, messages, enums, groupes oneof, services et RPC. Les références anticipées, imbriquées et récursives sont résolues sans dépendance externe. Un type introuvable bloque la génération. Les noms snake_case du code restent visibles même si leur représentation JSON utilise lowerCamelCase.

    Projection avec racine et définitions partagées

    Le document JSON Schema 2020-12 référence des noms complets dans $defs. repeated produit un tableau, map un objet et int64 une chaîne. Un oneof autorise zéro ou un membre présent, jamais deux. Aucun champ ne devient obligatoire automatiquement, y compris ceux marqués optional.

    Ce que les contrôles couvrent réellement

    Un fichier proto3 explicite
    Commencez par syntax = "proto3";. Proto2, Editions, required, group et extensions sont exclus. Tous les imports sont refusés, même pour Timestamp ou Any. Une définition avec dépendances doit être vérifiée avec les fichiers et les chemins de recherche du projet.
    Un ensemble connu d’options
    Les options habituelles de génération de code au niveau fichier et les usages admis de json_name, packed, deprecated et allow_alias sont conservés. Les options personnalisées ou agrégées, les annotations de validation et CEL sont refusés. Une option de génération n’ajoute pas de contrainte métier au schéma produit.
    Une projection, pas un parseur ProtoJSON complet
    La sortie décrit les formes usuelles produites en JSON. Elle ne reproduit pas toutes les entrées tolérées : null comme valeur absente, enums numériques ou chaînes numériques permissives. Les motifs d’entiers textuels ne vérifient pas toute la plage 64 bits ; contentEncoding base64 reste une annotation.
    Aucune réparation automatique du contrat
    Ni renumérotation, ni suppression de reserved, ni réécriture de l’entrée pendant le formatage. Un fichier actuel ne révèle pas les tags employés par une ancienne version. Compilation protoc, Buf lint, détection de rupture, génération de clients et sortie OpenAPI restent du ressort des outils du projet.
    Des ressources bornées
    Chaque traitement accepte 100 000 caractères UTF-16, 20 000 jetons, 2 000 déclarations et 32 niveaux d’imbrication. La sortie est limitée à 1 000 000 de caractères ; le worker s’arrête après huit secondes. Un dépassement provoque une erreur plutôt qu’un résultat tronqué annoncé comme complet.
    Des définitions et non des données encodées
    L’entrée attend du .proto, pas du binaire, du Base64 ou un message TextFormat. Le résultat peut être une source, un rapport de structure ou un schéma. Conversion inverse depuis JSON Schema, lots de fichiers, chargement distant et liens contenant le code ne sont pas proposés.

    Questions sur le formatage Protobuf

    Peut-on numéroter les champs à partir de zéro ?

    Non. Un tag de message va de 1 à 536870911, en excluant 19000–19999, réservés à l’implémentation. Les enums suivent une règle différente : la première déclaration d’une énumération proto3 doit valoir zéro. Le contrôle distingue ces deux usages pour ne pas confondre un tag interdit avec une valeur d’énumération obligatoire.

    Peut-on laisser des trous entre les numéros ?

    Oui, les tags ne doivent pas être consécutifs. Un champ 1 suivi d’un champ 20 est valable en l’absence de conflit. La mise en forme ne referme pas cet intervalle et ne change pas l’ordre des champs. Utilisez reserved pour empêcher la réutilisation d’un ancien tag ; une simple absence de numéro ne mémorise pas cet historique.

    Comment déclarer un champ optional en proto3 ?

    Placez optional devant son type pour conserver une information explicite de présence dans le code généré. L’arbre montre ce choix. Le schéma JSON permet cependant l’absence des champs simples comme des champs optional ; il ne décrit ni la méthode has générée, ni la différence entre une valeur absente et une valeur par défaut renvoyée à l’exécution.

    Pourquoi int64 devient-il une chaîne dans JSON ?

    Une valeur numérique JavaScript ne représente pas exactement tous les entiers 64 bits. Les sorties ProtoJSON courantes utilisent donc des chaînes décimales. La projection suit cette forme sans conversion en Number. Le motif contrôle l’écriture, mais le respect exact de la plage signée ou non signée nécessite un contrôle supplémentaire.

    Pourquoi un import échoue-t-il avec un chemin correct ?

    Le compilateur recherche les fichiers par rapport à des racines d’import configurées. Ce panneau ne possède ni arborescence de fichiers ni résolveur de dépendances : il refuse chaque import. Vérifiez le projet complet avec protoc ou Buf. Aucun chemin n’est téléchargé ou ignoré pour fabriquer un succès apparent.

    Une définition devrait être prise en charge ?

    Relire la prochaine modification

    Le formatage Protobuf aide à examiner les déclarations prises en charge avant de rapporter la source et sa forme JSON au projet. La compilation finale demande toujours l’ensemble des dépendances.