1. 概要

この短いチュートリアルでは、オブジェクトをバイト配列に変換する方法、およびその逆の方法を学習します。

2. プレーンJavaを使用する

たとえば、Userクラスがあるとします。

public class User implements Serializable {
    private String name;

    @Override
    public String toString() {
        return "User{name=" + name +  "}";
    }

    // getters and setters
}

ByteArrayOutputStreamおよびObjectOutputStreamオブジェクトを使用して、オブジェクトをバイト配列にシリアル化できます。

ストリームを閉じることを心配する必要がないように、try-with-resourcesを使用することを忘れないでください。

User user = new User();
user.setName("Josh");
try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(bos)) {
    oos.writeObject(user);
}

次に、ByteArrayInputStreamObjectInputStreamを使用して、受信したバイト配列をオブジェクトに逆シリアル化してから、最終的にUserにキャストします。

try (ByteArrayInputStream bis = new ByteArrayInputStream(data);
     ObjectInputStream ois = new ObjectInputStream(bis)) {
    User deserializedUser = (User) ois.readObject();
    System.out.println(deserializedUser);
}

ユーザークラスはSerializableインターフェイスを実装する必要があることに注意してください。 それ以外の場合、上記のコードはNotSerializableExceptionをスローします。

3. ApacheCommonsLangを使用する

Apache CommonsLangライブラリのSerializationUtilsクラスを使用して、同じ目標を達成できます。

このクラスには、 serialize()という名前のメソッドがあります。このメソッドは、オブジェクトをバイト配列にシリアル化するために使用されます。

byte[] data = SerializationUtils.serialize(user);

そして、 deserialize()メソッドを使用して、バイト配列をオブジェクトに逆シリアル化します。

User deserializedUser = SerializationUtils.deserialize(data);

上記のメソッドにはSerializableタイプのパラメーターがあります。したがって、 User クラスは、プレーンJavaの例と同様に、Serializableインターフェースを実装する必要があります。

4. SpringFrameworkのSerializationUtilsクラスを使用する

最後に、プロジェクトですでにSpring Frameworkを使用している場合は、org.springframework.utilパッケージのSerializationUtilsクラスを使用できます。 メソッド名は、ApacheCommonsLangライブラリのメソッド名と同じです。

まず、Userオブジェクトをバイト配列にシリアル化できます。

byte[] data = SerializationUtils.serialize(user);

そして、結果を逆シリアル化してUserオブジェクトに戻すことができます。

User deserializedUser = SerializationUtils.deserialize(data);

通常どおり、UserクラスはSerializableインターフェイスを実装する必要があります。そうしないと、上記のコードを実行したときにNotSerializableExceptionが発生します。

5. 結論

要約すると、オブジェクトをバイト配列に変換し、その逆を行うの3つの異なる方法を学びました。 これらのメソッドはすべて、ジョブを実行するためにシリアル化可能なインターフェイスを実装するための入力オブジェクトを必要とします。