高度な Java では、シリアル化と逆シリアル化はオブジェクトの状態を保存および復元するプロセスであり、オブジェクトをファイルやデータベースに保存したり、ネットワーク経由で転送したりすることが可能になります。これらの概念とその応用について詳しく説明します
1️⃣連載
シリアル化は、オブジェクトをバイトのストリームに変換するプロセスです。このバイト ストリームは、ファイルに保存したり、ネットワーク経由で送信したり、データベースに保存したりできます。 Java では、クラスがシリアル化できることを示すために Serializable インターフェイスが使用されます。
✍ オブジェクトをシリアル化する手順:
▶️ シリアル化可能なインターフェースを実装します。
▶️ ObjectOutputStream と FileOutputStream を使用して、オブジェクトをファイルまたは出力ストリームに書き込みます。
▶️ ObjectOutputStream で writeObject() メソッドを呼び出します。
?コード例:
import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.io.Serializable; class Employee implements Serializable { private static final long serialVersionUID = 1L; String name; int id; public Employee(String name, int id) { this.name = name; this.id = id; } } public class SerializeDemo { public static void main(String[] args) { Employee emp = new Employee("John Doe", 101); try (FileOutputStream fileOut = new FileOutputStream("employee.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut)) { out.writeObject(emp); System.out.println("Serialized data is saved in employee.ser"); } catch (Exception e) { e.printStackTrace(); } } }
ここで、employee.ser はオブジェクトのバイト ストリームを格納するシリアル化されたファイルです。
2️⃣ 逆シリアル化
逆シリアル化はその逆のプロセスで、バイト ストリームが元のオブジェクトのコピーに変換されて戻されます。これにより、オブジェクトの保存または転送後にオブジェクトの状態を再作成できます。
✍ オブジェクトを逆シリアル化する手順:
▶️ ObjectInputStream と FileInputStream を使用して、ファイルまたは入力ストリームからオブジェクトを読み取ります。
▶️ ObjectInputStrea
で readObject() メソッドを呼び出します。?コード例:
import java.io.FileInputStream; import java.io.ObjectInputStream; public class DeserializeDemo { public static void main(String[] args) { Employee emp = null; try (FileInputStream fileIn = new FileInputStream("employee.ser"); ObjectInputStream in = new ObjectInputStream(fileIn)) { emp = (Employee) in.readObject(); System.out.println("Deserialized Employee..."); System.out.println("Name: " + emp.name); System.out.println("ID: " + emp.id); } catch (Exception e) { e.printStackTrace(); } } }
これにより、オブジェクトの元の状態が取得され、シリアル化前と同じようにフィールドにアクセスできるようになります。
3️⃣ 高度な連載トピック
▶️ カスタムシリアル化: カスタマイズされたシリアル化のために writeObject() と readObject() をオーバーライドします。
▶️ 外部化可能なインターフェイス: シリアル化に対する完全な制御を提供し、writeExternal() メソッドと readExternal() メソッドの実装を必要とします。
▶️一時フィールド: 特定のフィールド (パスワードなどの機密データなど) のシリアル化を回避するには、transient キーワードを使用します。
✍ シリアル化の利点:
▶️ 将来の使用のためにオブジェクトの状態を保存できます。
▶️ ネットワーク経由での複雑なデータ オブジェクトの転送を容易にします。
?コード例を簡単に説明します
import java.io.*; class Student implements Serializable { private static final long serialVersionUId = 1l; private String name ; private int age; private String Address; public Student(String name,int age,String Address){ this.name = name; this.age = age; this.Address = Address; } public void setName(String name){ this.name = name; } public void setAge(int age){ this.age = age; } public void setAddress(String Address){ this.Address = Address; } public String getName(){ return name; } public String getAddress(){ return Address; } public int getAge(){ return age; } public String toString(){ return ("Student name is "+this.getName()+", age is "+this.getAge()+", and address is "+this.getAddress()); } } public class JAVA3_Serialization { // when you implement Serializable then you must be write a serialVersionUId because when it serialise and deserialize it uniquely identify in the network // when u update ur object or anything then you have to update the serialVersionUId increment . // private static final long serialVersionUId = 1l; // transient int x ; // If you do not want a particular value to serialise and Deserialize. // the value x, when you don't serialise and Deserialize Then transient you used. public static void main(String[] args) { Student student = new Student("kanha",21,"angul odisha"); String filename = "D:\Advance JAVA\CLS3 JAVA\Test.txt"; // store the data in this location FileOutputStream fileOut = null; // write file ObjectOutputStream objOut = null; // create object //Serialization try { fileOut = new FileOutputStream(filename); objOut = new ObjectOutputStream(fileOut); objOut.writeObject(student); objOut.close(); fileOut.close(); System.out.println("Object has been serialise =\n"+student); } catch (IOException ex){ System.out.println("error will occure"); } //Deserialization FileInputStream fileIn = null; ObjectInputStream objIn = null; try { fileIn = new FileInputStream(filename); objIn = new ObjectInputStream(fileIn); Student object =(Student) objIn.readObject(); System.out.println("object has been Deserialization =\n"+object); objIn.close(); fileIn.close(); } catch (IOException e) { throw new RuntimeException(e); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } }
✍ 重要なメモ:
▶️ デフォルトでは、非静的および非一時的なデータ メンバーのみがシリアル化されます。
▶️ シリアル化可能オブジェクトは、シリアル化後にクラスが変更された場合、バージョン間の互換性を保証する必要があります。
さらに詳しい情報が必要な場合は、お気軽に GitHub に言及して詳細な例とコード サンプルをご覧ください。具体的な調整が必要な場合はお知らせください。
GitHub - https://github.com/Prabhanjan-17p
以上がJava でのシリアル化と逆シリアル化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。