Wejście (schemat .proto)

Wyjście (Kotlin)

Co robi to narzędzie

Masz schemat Protocol Buffers — może od zespołu backendowego, może z kontraktu API zewnętrznego dostawcy — i kod w Kotlinie, który potrzebuje pasujących typowanych form. Albo aplikacja Androida wołająca backend gRPC, albo Kotlin po stronie serwera parsujący wiadomości Protobuf zakodowane w JSON. Stawianie pełnego pipeline’u codegen grpc-kotlin to przerost formy, jeśli potrzebujesz tylko kształtów data class — wklej, skopiuj, wrzuć.

Mapowanie typów trzyma się idiomów Kotlina: stringString, boolBoolean, bytesByteArray, int32/sint32/fixed32Int, int64/sint64/fixed64Long, doubleDouble, floatFloat. repeated T staje się List<T> z domyślnym emptyList(); map<K, V> staje się Map<K, V> z domyślnym emptyMap(). Pojedyncze pola zagnieżdżonych wiadomości są nullowalne (?) z domyślnym null — pasuje do semantyki has-value w proto3.

Nazwy pól są konwertowane z snake_case w proto na camelCase w Kotlinie (order_idorderId) — standardowa konwencja kodowania Kotlina według oficjalnego stylu Kotlin. Nazwy klas i enumów pozostają w PascalCase. Każdy enum staje się enum class z polem Int w tle. Konwersja działa w całości w twojej przeglądarce — twój .proto nigdy nie opuszcza strony.

Jak tego użyć

Trzy kroki. Wynik to Kotlin gotowy do wklejenia.

1

Wklej swój schemat .proto

Wrzuć schemat do edytora po lewej. syntax = "proto3"; u góry jest ok, ale opcjonalne. Zagnieżdżone bloki message, deklaracje enum, oneof, map<K, V> i opcje pól — wszystko jest obsłużone.

Konwencje kodowania Kotlina preferują camelCase dla właściwości — konwerter robi to za ciebie. Jeśli wolisz oryginalne nazwy w snake_case (niektóre biblioteki serializacji wymagają zgodności nazw 1:1), użyj znajdź-zamień na wyjściu.

2

Przeczytaj wynik w Kotlinie

Po prawej: każda wiadomość staje się data class z domyślnymi wartościami dla każdej właściwości. Każdy enum staje się enum class(val value: Int), dzięki czemu możesz wykonać round-trip formatu wire. Tylko poziom korzenia (bez zagnieżdżeń) — łatwo wrzucić do jednego pliku albo rozbić.

3

Podłącz do projektu

Wrzuć plik do projektu, dodaj deklarację package i zaimportuj. Do prawdziwego kodu gRPC na Androidzie lub JVM nadal będziesz chciał uruchomić codegen grpc-kotlin, by mieć metody marshal i stuby. To wyjście służy do typowanej obsługi JSON, szkiców struktur i przeglądów.

Kiedy to naprawdę oszczędza czas

Szkicowanie typów dla Androida z .proto backendu

Twoja aplikacja Androida rozmawia z backendem gRPC. .proto należy do zespołu backendu. Chcesz kształtów data class, by otypować view modele bez stawiania jeszcze codegen. Wklej, wrzuć do Models.kt, masz typy.

Kotlin po stronie serwera parsujący Protobuf zakodowany w JSON

Twój Kotlin po stronie serwera (Ktor / Spring Boot) konsumuje JSON zgodny z kodowaniem JSON proto3. Potrzebujesz pasujących data class. Wklej .proto, skopiuj wynik Kotlin, podłącz do wybranego serializatora.

Przegląd zmiany API Protobuf

Kolega z zespołu dodał pola do wiadomości. Wklej nowe .proto, zrób diff wyniku Kotlin z bieżącym Models.kt, zostaw skupioną review bez stawiania całego toolchaina.

Jednorazowe skrypty i szybkie prototypy

Pięćdziesięciolinijkowy skrypt Kotlin uderzający w gRPC-gateway. Stawianie grpc-kotlin i protoc tylko po to to przesada. Wygeneruj data classy tutaj i wrzuć je tam.

Najczęstsze pytania

Czy to zastępuje protoc-gen-kotlin?

Nie. Prawdziwy codegen produkuje metody marshal/unmarshal, deskryptory i stuby gRPC. To narzędzie generuje tylko kształty data class. Do produkcyjnego kodu gRPC uruchom grpc-kotlin. Tego używaj do szkiców, parsowania JSON, przeglądów i jednorazowych skryptów.

Dlaczego pojedyncze pola wiadomości są nullowalne?

W proto3 pola typu wiadomość mają semantykę "has value" — mogą być nieustawione. Najczystszy odpowiednik w Kotlinie to nullowalna właściwość z domyślnym null. Jeśli wiesz, że twoje dane zawsze wypełniają te pola, usuń ? i domyślną wartość — proste znajdź-zamień.

Jak są obsługiwane uint32 i uint64?

Oba mapują się na typy ze znakiem (Int i Long). Kotlin ma stabilne typy UInt i ULong od wersji 1.5, ale typy ze znakiem są bardziej kompatybilne z istniejącymi bibliotekami serializacji i większością kodów na Androida. Jeśli koniecznie potrzebujesz wariantów bez znaku, podmień je w wyjściu.

Jak generowane są enumy?

Każdy staje się enum class WithValue(val value: Int), byś mógł zachować liczbę z formatu wire. Każda wartość dostaje oryginalną nazwę z proto (np. ORDER_STATUS_PENDING) — wpisy enumów w Kotlinie i tak są umownie w SCREAMING_SNAKE_CASE, więc się zgadza.

Jak konwertowane są nazwy pól?

snake_casecamelCase zgodnie z konwencjami kodowania Kotlin. order_id staje się orderId, customer_name staje się customerName. Nazwy klas i enumów pozostają w PascalCase tak jak w proto.

Czy obsługuje zagnieżdżone wiadomości?

Tak — zagnieżdżone bloki message są w wyjściu spłaszczane do deklaracji data class na poziomie korzenia. Plik pozostaje czytelny i łatwy do podzielenia na wiele plików. Jeśli wolisz zagnieżdżone klasy Kotlina, opakuj je ręcznie.

Powiązane narzędzia

Jeśli pracujesz z Protobuf i Kotlinem, te dobrze ze sobą współgrają: