最新の代替手段: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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Java シリアライズの基本
- transient フィールドと serialVersionUID
- カスタムシリアライズ:writeObject と readObject
- 最新の代替手段:JSON と Protocol Buffers