Java Academy · Lekcja

Nowoczesne alternatywy: JSON i Protocol Buffers

Zastępuj serializację Javy formatem JSON obsługiwanym przez Jackson oraz Protocol Buffers, aby zapewnić przenośne i bezpieczne utrwalanie danych.

Lekcja 4 z 413 kroki

Nowoczesne alternatywy: JSON i Protocol Buffers to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.

Dlaczego zastąpić serializację Javy?

Serializacja w Javie działa wyłącznie w JVM, jest rozwlekła, wolna i stanowi zagrożenie bezpieczeństwa. Nowoczesne aplikacje preferują JSON — czytelny dla człowieka i niezależny od języka — lub Protocol Buffers, które są kompaktowe, szybkie i oparte na schemacie.

Jackson: faktycznie standardowa biblioteka JSON

ObjectMapper biblioteki Jackson konwertuje obiekty na ciągi JSON i z powrotem. Należy dodać com.fasterxml.jackson.core:jackson-databind do projektu.

ObjectMapper mapper = new ObjectMapper();
User user = new User("Alice", 30);
String json = mapper.writeValueAsString(user);
System.out.println(json); // {"name":"Alice","age":30}
User restored = mapper.readValue(json, User.class);

Dostosowywanie biblioteki Jackson za pomocą adnotacji

Adnotacje @JsonProperty, @JsonIgnore, @JsonAlias i @JsonFormat pozwalają kontrolować serializację bez zmieniania nazw pól w modelu.

public class Product {
    @JsonProperty("product_name")
    private String name;
    @JsonIgnore
    private String internalCode;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate releaseDate;
}

Moduły biblioteki Jackson: obsługa Java Time

Należy zarejestrować JavaTimeModule, aby poprawnie serializować LocalDate, LocalDateTime i Instant, zamiast otrzymywać obiekt JSON wypełniony polami.

ObjectMapper mapper = new ObjectMapper()
    .registerModule(new JavaTimeModule())
    .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
String json = mapper.writeValueAsString(LocalDate.now());
System.out.println(json); // "2024-06-15"

GSON jako lekka alternatywa

Biblioteka GSON firmy Google jest prostsza niż Jackson: w przypadku podstawowych typów nie wymaga konfiguracji, ale przy dużej skali oferuje uboższy zestaw adnotacji i niższą wydajność niż Jackson.

Gson gson = new Gson();
String json = gson.toJson(new User("Bob", 25));
User user = gson.fromJson(json, User.class);

Czym są Protocol Buffers?

Protocol Buffers (Protobuf) to binarny format serializacji firmy Google. Definiuje się schemat .proto, kompiluje go do klas Javy i otrzymuje kompaktowe komunikaty z wbudowanym wersjonowaniem.

// user.proto
syntax = "proto3";
message UserProto {
    string name = 1;
    int32  age  = 2;
}

Kodowanie komunikatu Protobuf

Wygenerowane klasy udostępniają interfejs buildera. Należy wywołać toByteArray(), aby uzyskać dane binarne, oraz parseFrom(bytes), aby je zdekodować.

UserProto user = UserProto.newBuilder()
    .setName("Alice")
    .setAge(30)
    .build();
byte[] bytes = user.toByteArray();
UserProto restored = UserProto.parseFrom(bytes);
System.out.println(restored.getName());

Kompromisy między JSON a Protobuf

JSON jest czytelny dla człowieka i nie wymaga schematu, natomiast Protobuf jest od 3 do 10 razy mniejszy i szybszy, ale wymaga schematu oraz generowania kodu. JSON należy wybierać dla interfejsów REST, a Protobuf dla wewnętrznych usług o dużej przepustowości.

Ewolucja schematu w Protobuf

Pola Protobuf mają numery, a nie nazwy. Można bezpiecznie dodawać nowe pola lub wycofywać stare bez psucia istniejących klientów — pod warunkiem że numery pól nigdy nie zostaną ponownie użyte.

// v2 of user.proto — backwards compatible
message UserProto {
    string name  = 1;
    int32  age   = 2;
    string email = 3; // new in v2
}

Migracja z serializacji Javy

Ścieżki zapisu korzystające z ObjectOutputStream należy zastąpić metodą ObjectMapper.writeValue() lub metodą Protobuf writeTo(). Starą serializację należy zachować wyłącznie na potrzeby migracji starszych danych.

Bezpieczeństwo: brak gadżetów deserializacji

JSON i Protobuf nie wywołują dowolnych konstruktorów ani metod podczas deserializacji, eliminując ataki z użyciem łańcuchów gadżetów, które zagrażają serializacji w Javie.

Szybkie sprawdzenie

Jaka jest kluczowa zaleta Protocol Buffers w porównaniu z JSON?

Podsumowanie

Serializację Javy należy zastępować biblioteką Jackson JSON w przypadku interfejsów REST i czytelności danych lub Protocol Buffers w usługach wymagających wysokiej wydajności. Oba rozwiązania są międzyjęzykowe, umożliwiają ewolucję schematu i zapewniają bezpieczeństwo dzięki swojej konstrukcji.

Bezpłatny start

Ucz się Java dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
104
Lekcje
374

Często zadawane pytania

Czy lekcja „Nowoczesne alternatywy: JSON i Protocol Buffers” jest bezpłatna?

Tak — pełny tekst „Nowoczesne alternatywy: JSON i Protocol Buffers” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Nowoczesne alternatywy: JSON i Protocol Buffers”?

Zastępuj serializację Javy formatem JSON obsługiwanym przez Jackson oraz Protocol Buffers, aby zapewnić przenośne i bezpieczne utrwalanie danych. Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Java Academy?

Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Nowoczesne alternatywy: JSON i Protocol Buffers”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?

Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Podstawy serializacji w Javie
  2. Pola transient i serialVersionUID
  3. Własna serializacja: writeObject i readObject
  4. Nowoczesne alternatywy: JSON i Protocol Buffers
← Powrót do Java Academy