0Pricing
Java Academy · レッスン

最新の代替手段:JSON と Protocol Buffers

移植性と安全性に優れた永続化のため、Java のシリアライズを Jackson JSON と Protocol Buffers に置き換えます。

「最新の代替手段:JSON と Protocol Buffers」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。

Javaシリアライズを置き換える理由

JavaのシリアライズはJVM専用で、冗長かつ低速であり、セキュリティ上のリスクもあります。最新のアプリケーションでは、JSON(人間が読みやすく言語に依存しない形式)やProtocol Buffers(コンパクトでスキーマ駆動かつ高速な形式)が好まれます。

Jackson:事実上のJSONライブラリ

JacksonのObjectMapperは、オブジェクトをJSON文字列に変換したり、JSON文字列からオブジェクトに戻したりします。プロジェクトにcom.fasterxml.jackson.core:jackson-databindを追加してください。

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);

アノテーションによるJacksonのカスタマイズ

@JsonProperty、@JsonIgnore、@JsonAlias、@JsonFormatを使用すると、モデル内のフィールド名を変更せずにシリアライズを制御できます。

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

Jacksonモジュール:Java Timeのサポート

JavaTimeModuleを登録すると、LocalDate、LocalDateTime、Instantを正しくシリアライズできます。登録しない場合のように、フィールドで埋め尽くされたJSONオブジェクトになることを防げます。

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

GoogleのGSONはJacksonよりシンプルです。基本型であれば設定は不要ですが、アノテーションの豊富さや大規模環境での性能ではJacksonに及びません。

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

Protocol Buffersとは

Protocol Buffers(Protobuf)は、Googleのバイナリシリアライズ形式です。.protoスキーマを定義してJavaクラスにコンパイルすると、組み込みのバージョン管理機能を持つコンパクトなメッセージを利用できます。

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

Protobufメッセージのエンコード

生成されたクラスにはビルダーAPIがあります。toByteArray()を呼び出すとバイナリペイロードを取得でき、parseFrom(bytes)でデコードできます。

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

JSONとProtobufのトレードオフ

JSONは人間が読みやすくスキーマ不要です。一方、Protobufは3~10倍小さく高速ですが、スキーマとコード生成が必要です。REST APIにはJSON、高スループットの内部サービスにはProtobufを選択してください。

Protobufによるスキーマの進化

Protobufのフィールドは名前ではなく番号で識別されます。フィールド番号を決して再利用しなければ、新しいフィールドを安全に追加したり、古いフィールドを非推奨にしたりしても、既存のクライアントを壊さずに済みます。

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

Javaシリアライズからの移行

ObjectOutputStreamへの書き込み処理を、ObjectMapper.writeValue()またはProtobufのwriteTo()に置き換えます。古いシリアライズは、レガシーデータの移行に限って残してください。

セキュリティ:デシリアライズガジェットなし

JSONとProtobufはデシリアライズ中に任意のコンストラクターやメソッドを呼び出さないため、Javaシリアライズを悩ませてきたガジェットチェーン攻撃を排除できます。

クイックチェック

JSONと比べたProtocol Buffersの主な利点は何ですか。

まとめ

RESTや可読性を重視する場合はJavaシリアライズをJackson JSONに、性能が重要なサービスではProtocol Buffersに置き換えます。どちらも複数言語に対応し、スキーマを進化させやすく、設計上安全です。

よくある質問

「最新の代替手段:JSON と Protocol Buffers」レッスンは無料ですか?

はい。「最新の代替手段:JSON と Protocol Buffers」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。

「最新の代替手段:JSON と Protocol Buffers」で何を学びますか?

移植性と安全性に優れた永続化のため、Java のシリアライズを Jackson JSON と Protocol Buffers に置き換えます。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「最新の代替手段:JSON と Protocol Buffers」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Java シリアライズの基本
  2. transient フィールドと serialVersionUID
  3. カスタムシリアライズ:writeObject と readObject
  4. 最新の代替手段:JSON と Protocol Buffers
← Java Academyに戻る