Protobuf till Kotlin-konverterare
Klistra in ett .proto-schema. Få Kotlin data classes med rätt typer, camelCase-fält och defaultvärden.
Indata (.proto-schema)
Utdata (Kotlin)
Vad det här verktyget gör
Du har ett Protocol Buffers-schema — kanske från backend-teamet, kanske från ett tredjeparts-API-kontrakt — och en Kotlin-kodbas som behöver typade former för det. Antingen en Android-app som anropar en gRPC-backend, eller serverside-Kotlin som parsar JSON-kodade Protobuf-meddelanden. Att sätta upp hela grpc-kotlin-codegen-pipelinen är överdrivet om du bara behöver data class-formerna — klistra, kopiera, släng in.
Typmappingen följer Kotlin-idiom: 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(). Enskilda nästlade meddelandefält är nullable (?) med default null — matchar proto3:s has-value-semantik.
Fältnamn konverteras från snake_case i proto till camelCase i Kotlin (order_id → orderId) — standard-Kotlin-kodningskonventionen enligt officiell Kotlin-stil. Klass- och enumnamn behålls i PascalCase. Varje enum blir en enum class med ett Int-backingvärde. Konverteringen körs helt i din webbläsare — din .proto lämnar aldrig sidan.
Så använder du det
Tre steg. Utdata är klistra-klar Kotlin.
Klistra in ditt .proto-schema
Släpp schemat i editorn till vänster. syntax = "proto3"; överst är okej men valfritt. Nästlade message-block, enum-deklarationer, oneof, map<K, V> och fältoptioner hanteras alla.
Kotlin-kodningskonventioner föredrar camelCase för properties — konverteraren gör det åt dig. Föredrar du de ursprungliga snake_case-namnen (vissa serialiseringsbibliotek matchar fältnamn exakt) gör du sök-och-ersätt i utdata.
Läs Kotlin-utdata
Till höger: varje meddelande blir en data class med defaultvärden för varje property. Varje enum blir en enum class(val value: Int) så att du kan göra round-trip på wire-formatet. Bara på rotnivå (ingen nästling) — lätt att slänga in i en fil eller dela upp.
Koppla in det i ditt projekt
Släpp filen i ditt projekt, lägg till en package-deklaration och importera. För riktig gRPC-kod på Android eller JVM vill du fortfarande köra grpc-kotlin-codegen för att få marshal-metoder och stubs. Den här utdatan är för typad JSON-hantering, struct-skisser och granskningar.
När det här faktiskt sparar tid
Skissa Android-typer från en backend-.proto
Din Android-app pratar med en gRPC-backend. Backend-teamet äger .proto:n. Du vill ha data class-formerna för att typa dina view models utan att sätta upp codegen än. Klistra, släng in i Models.kt, du är typad.
Serverside-Kotlin som parsar JSON-kodad Protobuf
Din serverside-Kotlin (Ktor / Spring Boot) konsumerar JSON som följer proto3:s JSON-kodning. Du behöver data classes som matchar. Klistra in .proto:n, kopiera Kotlin-utdata, koppla in i din valda serializer.
Granska en Protobuf-API-ändring
En kollega har lagt till fält i ett meddelande. Klistra in den nya .proto:n, diffa Kotlin-utdata mot din nuvarande Models.kt, lämna en fokuserad granskning utan att dra igång hela toolchainen.
Engångsskript och snabba prototyper
Ett 50-raders Kotlin-skript som slår mot en gRPC-gateway. Att sätta upp grpc-kotlin och protoc bara för det är överdrivet. Generera data classerna här och släng in dem.
Vanliga frågor
Är det här en ersättare för protoc-gen-kotlin?
Nej. Riktig codegen producerar marshal/unmarshal-metoder, descriptors och gRPC-stubs. Det här verktyget skickar bara ut data class-formerna. Kör grpc-kotlin för produktions-gRPC-kod. Använd det här för skisser, JSON-parsing, granskningar och engångsskript.
Varför är enskilda meddelandefält nullable?
I proto3 har meddelandefält en "has value"-semantik — de kan vara osatta. Den renaste Kotlin-motsvarigheten är en nullable property med default null. Vet du att din data alltid fyller dessa fält tar du bort ?:t och defaulten — rakt-på sök-och-ersätt.
Hur hanteras uint32 och uint64?
Båda mappar till signerade typer (Int och Long). Kotlin har stabila UInt- och ULong-typer sedan 1.5, men signerade typer är mer kompatibla med befintliga serialiseringsbibliotek och de flesta Android-kodbaser. Behöver du specifikt de osignerade varianterna byter du in dem i utdata.
Hur skickas enums ut?
Var och en blir en enum class WithValue(val value: Int) så att du kan bevara wire-formatets heltal. Varje värde får det ursprungliga proto-namnet (t.ex. ORDER_STATUS_PENDING) — Kotlin-enum-poster är konventionellt redan i SCREAMING_SNAKE_CASE, så det matchar.
Hur konverteras fältnamn?
snake_case → camelCase enligt Kotlin-kodningskonventioner. order_id blir orderId, customer_name blir customerName. Klass- och enumnamn behålls i PascalCase som i proto.
Hanterar det nästlade meddelanden?
Ja — nästlade message-block plattas i utdata till data class-deklarationer på rotnivå. Det håller filen lätt att läsa och splittra över flera filer. Föredrar du Kotlins nästlade klasser, slå in dem för hand.
Relaterade verktyg
Jobbar du med Protobuf och Kotlin passar dessa bra ihop: