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: stringString, boolBoolean, bytesByteArray, int32/sint32/fixed32Int, int64/sint64/fixed64Long, doubleDouble, floatFloat. 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_idorderId) — 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.

1

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.

2

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.

3

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_casecamelCase 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: