Protobuf til Kotlin-konverter
Lim inn et .proto-skjema. Få Kotlin data classes med riktige typer, camelCase-felter og defaultverdier.
Inndata (.proto-skjema)
Utdata (Kotlin)
Hva dette verktøyet gjør
Du har et Protocol Buffers-skjema — kanskje fra backend-teamet, kanskje fra en tredjeparts API-kontrakt — og en Kotlin-kodebase som trenger typede former til det. Enten en Android-app som snakker mot en gRPC-backend, eller serverside-Kotlin som parser JSON-kodede Protobuf-meldinger. Å sette opp hele grpc-kotlin-codegen-pipelinen er overkill hvis du bare trenger formene til data class — lim inn, kopier, slipp inn.
Type-mappingen følger Kotlin-idiomer: string → String, bool → Boolean, bytes → ByteArray, int32/sint32/fixed32 → Int, int64/sint64/fixed64 → Long, double → Double, float → Float. repeated T blir List<T> med default emptyList(); map<K, V> blir Map<K, V> med default emptyMap(). Enkelt-meldingsfelter er nullable (?) med default null — passer med proto3 sin has-value-semantikk.
Feltnavn konverteres fra snake_case i protoen til camelCase i Kotlin (order_id → orderId) — standard Kotlin-kodingskonvensjon ifølge offisiell Kotlin-stil. Klasse- og enum-navn forblir PascalCase. Hver enum blir en enum class med en Int-backingverdi. Konverteringen kjører helt og holdent i nettleseren — .proto-en din forlater aldri siden.
Slik bruker du det
Tre trinn. Utdataen er Kotlin klar til å limes inn.
Lim inn .proto-skjemaet ditt
Slipp skjemaet i editoren til venstre. syntax = "proto3"; i toppen er greit, men valgfritt. Nestede message-blokker, enum-deklarasjoner, oneof, map<K, V> og feltvalg håndteres alle.
Kotlin-kodingskonvensjonene foretrekker camelCase for properties — konverteren gjør det for deg. Vil du heller ha de opprinnelige snake_case-navnene (noen serialiseringsbiblioteker krever eksakt feltnavn), kjører du finn-og-erstatt på utdataen.
Les Kotlin-utdataen
Til høyre: hver melding blir en data class med defaultverdier for hver property. Hver enum blir en enum class(val value: Int) så du kan round-trippe wire-formatet. Kun på rotnivå (ingen nesting) — lett å slenge i én fil eller dele opp.
Koble det inn i prosjektet
Slipp filen inn i prosjektet, legg til en package-deklarasjon og importer. For ekte gRPC-kode på Android eller JVM vil du fortsatt kjøre grpc-kotlin-codegen for å få marshal-metodene og stubsene. Denne utdataen er for typet JSON-håndtering, struct-skisser og reviewer.
Når dette faktisk sparer tid
Skissere Android-typer fra en backend-.proto
Android-appen din snakker med en gRPC-backend. Backend-teamet eier .proto-filen. Du vil ha data class-formene for å type view modellene dine uten å sette opp codegen ennå. Lim inn, slipp i Models.kt, du er typet.
Serverside-Kotlin som parser JSON-kodet Protobuf
Serverside-Kotlinen din (Ktor / Spring Boot) konsumerer JSON som følger proto3-JSON-kodingen. Du trenger data classes som matcher. Lim inn .proto-en, kopier Kotlin-utdataen og koble den på den serializeren du vil bruke.
Reviewe en Protobuf-API-endring
En lagkamerat har lagt til felter på en melding. Lim inn den nye .proto-en, diff Kotlin-utdataen mot din nåværende Models.kt, og legg igjen en fokusert review uten å dra opp hele toolchainen.
Engangsskript og raske prototyper
Et 50-liners Kotlin-skript som banker på en gRPC-gateway. Å sette opp grpc-kotlin og protoc bare for det er overkill. Generer data classene her og slipp dem inn.
Vanlige spørsmål
Er dette en erstatning for protoc-gen-kotlin?
Nei. Ekte codegen produserer marshal/unmarshal-metoder, descriptors og gRPC-stubs. Dette verktøyet emitterer kun data class-formene. Kjør grpc-kotlin for produksjons-gRPC-kode. Bruk dette til skisser, JSON-parsing, reviewer og engangsskript.
Hvorfor er enkelt-meldingsfelter nullable?
I proto3 har meldingsfelter en "has value"-semantikk — de kan være usatt. Den reneste Kotlin-motsvarigheten er en nullable property med default null. Vet du at dataene dine alltid fyller disse feltene, fjerner du ?-en og default-verdien — rett-fram finn-og-erstatt.
Hvordan håndteres uint32 og uint64?
Begge mappes til signed-typer (Int og Long). Kotlin har stabile UInt- og ULong-typer fra 1.5, men signed-typer er mer kompatible med eksisterende serialiseringsbiblioteker og de fleste Android-kodebaser. Trenger du spesifikt unsigned-variantene, bytter du dem inn i utdataen.
Hvordan emitteres enums?
Hver blir en enum class WithValue(val value: Int) så du kan bevare wire-formatets heltall. Hver verdi får det opprinnelige proto-navnet (f.eks. ORDER_STATUS_PENDING) — Kotlin enum-oppføringer er pr. konvensjon allerede SCREAMING_SNAKE_CASE, så det passer.
Hvordan konverteres feltnavn?
snake_case → camelCase i tråd med Kotlin-kodingskonvensjoner. order_id blir orderId, customer_name blir customerName. Klasse- og enum-navn forblir i PascalCase som i protoen.
Håndterer den nestede meldinger?
Ja — nestede message-blokker flates i utdataen ut til data class-deklarasjoner på rotnivå. Det holder filen lett å lese og enkel å splitte over flere filer. Vil du heller ha Kotlins nestede klasser, pakker du dem inn for hånd.
Relaterte verktøy
Jobber du med Protobuf og Kotlin, passer disse godt sammen: