シリアル化は、オブジェクトの状態情報を保存または送信できる形式に変換するプロセスです。一般に、オブジェクトはファイルやメモリ バッファなどの記憶媒体に保存されます。ネットワーク送信中は、バイト形式または XML 形式にすることができます。バイトまたは XML エンコード形式は、まったく同等のオブジェクトを復元できます。この逆のプロセスはデシリアライゼーションとも呼ばれます。
Java オブジェクトのシリアル化と逆シリアル化
Java では、さまざまな方法でオブジェクトを作成でき、オブジェクトがリサイクルされない限り、オブジェクトを再利用できます。ただし、作成したこれらの Java オブジェクトは、JVM のヒープ メモリに存在します。これらのオブジェクトは、JVM の実行中にのみ存在できます。 JVM の実行が停止すると、これらのオブジェクトの状態は失われます。
しかし、実際のアプリケーションのシナリオでは、これらのオブジェクトを永続化し、必要に応じてオブジェクトを再読み取りできるようにする必要があります。 Java のオブジェクトのシリアル化は、この機能の実現に役立ちます。
オブジェクトのシリアル化は、Java 言語に組み込まれたオブジェクトの永続化メソッドであり、オブジェクトのシリアル化を通じて、オブジェクトの状態をバイト配列として保存し、必要に応じてこのバイト配列を逆シリアル化してオブジェクトに変換できます。 。オブジェクトのシリアル化により、JVM でのライブ オブジェクトとバイト配列 (ストリーム) 間の変換が簡単になります。
Javaでは、オブジェクトのシリアル化と逆シリアル化がRMI(リモートメソッド呼び出し)やネットワーク送信で広く使われています。
関連するインターフェイスとクラス
Java は、開発者が Java オブジェクトをシリアル化および逆シリアル化するための便利な API サポートのセットを提供します。これらには、次のインターフェイスとクラスが含まれます: java.io.Serializable
クラスは、シリアル化機能を有効にするために java.io.Serializable インターフェイスを実装します。このインターフェイスを実装していないクラスは、その状態をシリアル化または逆シリアル化できません。直列化可能なクラスのすべてのサブタイプは、それ自体直列化可能です。シリアル化インターフェイスにはメソッドやフィールドがなく、シリアル化可能なセマンティクスを識別するためにのみ使用されます。 (このインターフェイスにはメソッドとフィールドがありません。なぜこのインターフェイスを実装するクラスのオブジェクトだけがシリアル化できるのでしょうか?)
オブジェクトをシリアル化しようとしたときに、Serializable インターフェイスをサポートしていないオブジェクトに遭遇した場合。この場合、NotSerializableException がスローされます。シリアル化するクラスに親クラスがあり、親クラスに定義されている変数も同時に永続化したい場合は、親クラスにもjava.io.Serializableインターフェースを統合する必要があります。
以下はjava.io.Serializableインターフェースを実装したクラスですpackage com.hollischaung.serialization.SerializableDemos; import java.io.Serializable; /** * Created by hollis on 16/2/17. * 实现Serializable接口 */ public class User1 implements Serializable { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
package com.hollischaung.serialization.SerializableDemos; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import java.io.*; /** * Created by hollis on 16/2/17. * SerializableDemo1 结合SerializableDemo2说明 一个类要想被序列化必须实现Serializable接口 */ public class SerializableDemo1 { public static void main(String[] args) { //Initializes The Object User1 user = new User1(); user.setName("hollis"); user.setAge(23); System.out.println(user); //Write Obj to File ObjectOutputStream oos = null; try { oos = new ObjectOutputStream(new FileOutputStream("tempFile")); oos.writeObject(user); } catch (IOException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(oos); } //Read Obj from File File file = new File("tempFile"); ObjectInputStream ois = null; try { ois = new ObjectInputStream(new FileInputStream(file)); User1 newUser = (User1) ois.readObject(); System.out.println(newUser); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(ois); try { FileUtils.forceDelete(file); } catch (IOException e) { e.printStackTrace(); } } } } //OutPut: //User{name='hollis', age=23} //User{name='hollis', age=23}
でオブジェクトのシリアル化と逆シリアル化を学んでいただければと思います。 Java の変換が役に立ちます。
Java でのオブジェクトのシリアル化と逆シリアル化に関連する詳細な記事については、PHP 中国語 Web サイトに注目してください。