0Pricing
Java Academy · レッスン

Java シリアライズの基本

Serializable を実装し、ObjectOutputStream でオブジェクトをストリームに書き込み、読み戻します。

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

Javaのシリアライズとは

シリアライズは、オブジェクトの状態をバイトストリームに変換し、ディスクへの保存、ネットワーク経由での送信、データベースへの格納を可能にします。デシリアライズはその逆の処理です。

Serializableマーカーインターフェース

クラスをシリアライズするには、java.io.Serializableを実装します。メソッドはなく、このクラスのインスタンスをシリアライズできることをJVMに知らせます。

import java.io.Serializable;
public class User implements Serializable {
    private String name;
    private int age;
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override public String toString() { return name + " / " + age; }
}

ObjectOutputStreamでオブジェクトを書き込む

FileOutputStreamをObjectOutputStreamでラップし、writeObject()を呼び出してシリアライズします。

import java.io.*;
try (ObjectOutputStream oos = new ObjectOutputStream(
        new FileOutputStream("user.ser"))) {
    oos.writeObject(new User("Alice", 30));
    System.out.println("Serialized successfully");
}

ObjectInputStreamでオブジェクトを読み込む

FileInputStreamをObjectInputStreamでラップし、readObject()を呼び出してデシリアライズします。結果を想定した型にキャストしてください。

import java.io.*;
try (ObjectInputStream ois = new ObjectInputStream(
        new FileInputStream("user.ser"))) {
    User u = (User) ois.readObject();
    System.out.println("Deserialized: " + u);
}

オブジェクトグラフのシリアライズ

シリアライズ対象のオブジェクトが参照するすべてのオブジェクトもSerializableを実装している必要があります。実装していない場合、実行時にNotSerializableExceptionがスローされます。

public class Order implements Serializable {
    private User customer;   // User must be Serializable
    private List<String> items;
    public Order(User customer, List<String> items) {
        this.customer = customer;
        this.items = items;
    }
}

NotSerializableException

オブジェクトグラフ内のいずれかのフィールドがシリアライズ可能ではなく、transientも付いていない場合、Javaは書き込み時にNotSerializableExceptionをスローします。

// Thread is NOT Serializable
public class Task implements Serializable {
    private Thread worker; // throws NotSerializableException!
    // Fix: mark as transient
    private transient Thread worker2;
}

オブジェクトグラフと共有参照

Javaはシリアライズ中にオブジェクトの同一性を追跡します。2つのフィールドが同じオブジェクトを参照している場合、書き込まれるコピーは1つだけで、デシリアライズ後も両方のフィールドが同じインスタンスを参照します。

コレクションのシリアライズ

ArrayList、HashMap、LinkedListなどの標準コレクションはすでにSerializableを実装しているため、要素がシリアライズ可能であればコレクションもシリアライズされます。

List<String> names = new ArrayList<>(List.of("Alice", "Bob"));
try (ObjectOutputStream oos = new ObjectOutputStream(
        new FileOutputStream("names.ser"))) {
    oos.writeObject(names);
}

継承とシリアライズ

スーパークラスがSerializableの場合、すべてのサブクラスもシリアライズ可能になります。スーパークラスがNOTシリアライズ可能な場合、スーパークラスのフィールドは保存されません。また、デシリアライズにはスーパークラスに引数なしコンストラクターが必要です。

バイトストリームの検証

シリアライズされたバイトストリームは、マジックバイト0xACED 0x0005で始まります。16進エディターで調べたり、SerialVerツールでデコードしたりすると、形式を確認できます。

セキュリティ警告

Javaのデシリアライズは、よく知られた攻撃ベクトルです。信頼できないソースからのデータは、検証せずに決してデシリアライズしないでください。外部データには、JSON、Protobuf、または署名付きエンベロープを使用することを推奨します。

クイックチェック

オブジェクトをストリームにシリアライズするメソッドはどれですか。

まとめ

JavaのシリアライズにはObjectOutputStreamとObjectInputStreamを使用します。クラスはSerializableを実装する必要があります。信頼できないデータのシリアライズは避け、新しいコードでは最新の代替手段を優先してください。

よくある質問

「Java シリアライズの基本」レッスンは無料ですか?

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

「Java シリアライズの基本」で何を学びますか?

Serializable を実装し、ObjectOutputStream でオブジェクトをストリームに書き込み、読み戻します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「Java シリアライズの基本」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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