Convertitore Protobuf a Kotlin
Incolla uno schema .proto. Ottieni data class Kotlin con tipi corretti, campi camelCase e valori di default.
Input (schema .proto)
Output (Kotlin)
Cosa fa questo strumento
Hai uno schema Protocol Buffers — magari dal team backend, magari dal contratto di un'API di terze parti — e una codebase Kotlin che ne ha bisogno tipizzata. O un'app Android che chiama un backend gRPC, o Kotlin lato server che parsifica messaggi Protobuf codificati come JSON. Tirare su l'intera pipeline di codegen di grpc-kotlin è esagerato se ti servono solo le forme delle data class — incolli, copi, butti dentro.
Il mapping dei tipi segue gli idiomi Kotlin: string → String, bool → Boolean, bytes → ByteArray, int32/sint32/fixed32 → Int, int64/sint64/fixed64 → Long, double → Double, float → Float. repeated T diventa List<T> con default emptyList(); map<K, V> diventa Map<K, V> con default emptyMap(). I campi message annidati singolari sono nullable (?) con default null — combacia con la semantica has-value di proto3.
I nomi dei campi passano da snake_case nel proto a camelCase in Kotlin (order_id → orderId) — la convenzione di codifica Kotlin standard secondo lo stile ufficiale Kotlin. I nomi di classe ed enum restano PascalCase. Ogni enum diventa una enum class con un valore Int di backing. La conversione gira interamente nel tuo browser — il tuo .proto non lascia mai la pagina.
Come si usa
Tre passi. L'output è Kotlin pronto da incollare.
Incolla il tuo schema .proto
Lascia cadere lo schema nell'editor di sinistra. syntax = "proto3"; in cima va bene ma è opzionale. Blocchi message annidati, dichiarazioni enum, oneof, map<K, V> e opzioni di campo sono tutti gestiti.
Le convenzioni di codice Kotlin preferiscono camelCase per le proprietà — il convertitore lo fa per te. Se preferisci i nomi originali in snake_case (alcune librerie di serializzazione richiedono nomi di campo identici), fai un trova-sostituisci nell'output.
Leggi l'output Kotlin
A destra: ogni message diventa una data class con valori di default per ogni proprietà. Ogni enum diventa una enum class(val value: Int) per fare round-trip del formato wire. Solo a livello root (senza annidamento) — facile da mettere in un singolo file o da spezzare.
Collegalo al tuo progetto
Lascia il file nel tuo progetto, aggiungi una dichiarazione package e importa. Per codice gRPC reale su Android o JVM vorrai comunque far girare il codegen di grpc-kotlin per avere i metodi marshal e gli stub. Questo output serve per il trattamento JSON tipizzato, abbozzi di struct e revisioni.
Quando ti fa risparmiare tempo davvero
Abbozzare tipi Android da un .proto del backend
La tua app Android parla con un backend gRPC. Il .proto appartiene al team backend. Vuoi le forme di data class per tipizzare i tuoi view model senza ancora montare il codegen. Incolli, butti in Models.kt, sei tipizzato.
Kotlin lato server che parsifica Protobuf codificato come JSON
Il tuo Kotlin lato server (Ktor / Spring Boot) consuma JSON che segue la codifica JSON di proto3. Ti servono data class che combacino. Incolla il .proto, copia l'output Kotlin, attaccalo al serializzatore che preferisci.
Revisione di un cambio di API Protobuf
Un compagno di team ha aggiunto campi a un message. Incolla il nuovo .proto, fai un diff dell'output Kotlin contro il tuo Models.kt attuale, lascia una review focalizzata senza tirare su l'intera toolchain.
Script una tantum e prototipi rapidi
Uno script Kotlin di 50 righe che picchia su un gRPC-gateway. Configurare grpc-kotlin e protoc solo per quello è esagerato. Genera le data class qui e mettile dentro.
Domande comuni
È un sostituto di protoc-gen-kotlin?
No. Il codegen vero produce metodi marshal/unmarshal, descriptor e gli stub gRPC. Questo strumento emette solo le forme di data class. Per codice gRPC di produzione fai girare grpc-kotlin. Usa questo per abbozzi, parsing JSON, revisioni e script una tantum.
Perché i campi message singolari sono nullable?
In proto3 i campi di tipo message hanno una semantica "has value" — possono essere non impostati. L'equivalente Kotlin più pulito è una proprietà nullable con default null. Se sai che i tuoi dati popolano sempre questi campi, togli il ? e il default — un trova-sostituisci diretto.
Come vengono gestiti uint32 e uint64?
Entrambi mappano su tipi con segno (Int e Long). Kotlin ha tipi UInt e ULong stabili dalla 1.5, ma quelli con segno sono più compatibili con le librerie di serializzazione esistenti e con la maggior parte delle codebase Android. Se ti servono espressamente le varianti senza segno, sostituiscile nell'output.
Come vengono emessi gli enum?
Ognuno diventa una enum class WithValue(val value: Int) per preservare l'intero del formato wire. Ogni valore prende il nome originale del proto (es. ORDER_STATUS_PENDING) — le voci di enum Kotlin sono per convenzione già SCREAMING_SNAKE_CASE, quindi combacia.
Come vengono convertiti i nomi dei campi?
snake_case → camelCase per le convenzioni di codifica Kotlin. order_id diventa orderId, customer_name diventa customerName. I nomi di classe ed enum restano PascalCase come nel proto.
Gestisce i message annidati?
Sì — i blocchi message annidati vengono appiattiti in dichiarazioni data class di livello root nell'output. Così il file resta facile da leggere e da spezzare in più file. Se preferisci le classi annidate Kotlin, racchiudile a mano.
Strumenti correlati
Se lavori con Protobuf e Kotlin, questi si combinano bene: