logo

Java でのシリアル化と逆シリアル化

  1. 連載
  2. シリアル化可能なインターフェイス
  3. シリアル化の例
  4. デシリアライズの例
  5. 継承を伴うシリアル化
  6. 外部化可能なインターフェース
  7. シリアル化と静的データ メンバー

Java でのシリアル化 のメカニズムです オブジェクトの状態をバイトストリームに書き込む 。主に Hibernate、RMI、JPA、EJB、および JMS テクノロジで使用されます。

シリアル化の逆の操作が呼び出されます。 逆シリアル化 ここで、バイトストリームはオブジェクトに変換されます。シリアル化と逆シリアル化のプロセスはプラットフォームに依存しません。つまり、あるプラットフォームでオブジェクトをシリアル化し、別のプラットフォームで逆シリアル化することができます。

オブジェクトをシリアル化するために、 writeObject() の方法 オブジェクト出力ストリーム クラスを作成し、逆シリアル化の場合は readObject() の方法 オブジェクト入力ストリーム クラス。

Javaスイッチケース

を実装する必要があります。 シリアル化可能 オブジェクトをシリアル化するためのインターフェイス。

Java シリアル化の利点

これは主に、ネットワーク上のオブジェクトの状態を移動するために使用されます (マーシャリングとして知られています)。

Javaのシリアル化

java.io.Serializableインターフェース

シリアル化可能 マーカー インターフェイスです (データ メンバーとメソッドはありません)。これは、Java クラスのオブジェクトが特定の機能を取得できるように、Java クラスを「マーク」するために使用されます。の クローン可能 そして リモート マーカーインターフェイスでもあります。

シリアル化可能 インターフェイスは、オブジェクトを永続化する必要があるクラスによって実装される必要があります。

String クラスとすべてのラッパー クラスは、 java.io.Serializable デフォルトのインターフェース。

以下に例を示します。

Student.java

 import java.io.Serializable; public class Student implements Serializable{ int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

上の例では、 学生 クラスはシリアライズ可能なインターフェイスを実装します。これで、そのオブジェクトをストリームに変換できるようになりました。のメインクラスの実装を次のコードに示します。

ObjectOutputStream クラス

ObjectOutputStream クラスは、プリミティブ データ型と Java オブジェクトを OutputStream に書き込むために使用されます。 java.io.Serializable インターフェースをサポートするオブジェクトのみをストリームに書き込むことができます。

コンストラクタ

Javaの配列リストを並べ替える
1) public ObjectOutputStream(OutputStream out) は IOException {} をスローします指定された OutputStream に書き込む ObjectOutputStream を作成します。

重要な方法

方法説明
1) public Final void writeObject(Object obj) が IOException {} をスローする指定されたオブジェクトを ObjectOutputStream に書き込みます。
2) public void flash() は IOException {} をスローします現在の出力ストリームをフラッシュします。
3) public void close() は IOException {} をスローします現在の出力ストリームを閉じます。

ObjectInputStream クラス

ObjectInputStream は、ObjectOutputStream を使用して書き込まれたオブジェクトとプリミティブ データを逆シリアル化します。

コンストラクタ

1) public ObjectInputStream(InputStream in) は IOException {} をスローします指定された InputStream から読み取る ObjectInputStream を作成します。

重要な方法

方法説明
1) public Final Object readObject() が IOException、ClassNotFoundException をスローする{}入力ストリームからオブジェクトを読み取ります。
2) public void close() は IOException {} をスローしますObjectInputStream を閉じます。

Java シリアル化の例

この例では、次のオブジェクトをシリアル化します。 学生 上記のコードのクラス。 ObjectOutputStream クラスの writeObject() メソッドは、オブジェクトをシリアル化する機能を提供します。オブジェクトの状態を f.txt という名前のファイルに保存します。

Persist.java

bash if ステートメント
 import java.io.*; class Persist{ public static void main(String args[]){ try{ //Creating the object Student s1 =new Student(211,'ravi'); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} } } 

出力:

 success 
このシリアル化の例をダウンロードする

Java デシリアライゼーションの例

逆シリアル化は、シリアル化された状態からオブジェクトを再構築するプロセスです。シリアル化の逆の操作です。逆シリアル化されたオブジェクトからデータを読み取る例を見てみましょう。

逆シリアル化は、シリアル化された状態からオブジェクトを再構築するプロセスです。シリアル化の逆の操作です。逆シリアル化されたオブジェクトからデータを読み取る例を見てみましょう。

Depersist.java

 import java.io.*; class Depersist{ public static void main(String args[]){ try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

出力:

211 ravi 
この逆シリアル化の例をダウンロードする

継承を伴う Java シリアル化 (IS-A 関係)

クラスが実装する場合 シリアル化可能なインターフェイス そうすれば、そのすべてのサブクラスもシリアル化可能になります。以下に例を示します。

ISA.java をシリアル化する

 import java.io.Serializable; class Person implements Serializable{ int id; String name; Person(int id, String name) { this.id = id; this.name = name; } } class Student extends Person{ String course; int fee; public Student(int id, String name, String course, int fee) { super(id,name); this.course=course; this.fee=fee; } } public class SerializeISA { public static void main(String args[]) { try{ //Creating the object Student s1 =new Student(211,'ravi','Engineering',50000); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name+' '+s.course+' '+s.fee); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

出力:

 success 211 ravi Engineering 50000 

SerializeISA クラスは、Serializable である Person クラスを拡張する Student クラス オブジェクトをシリアル化しました。親クラスのプロパティはサブクラスに継承されるため、親クラスがシリアル化可能であれば、サブクラスもシリアル化可能になります。

集約を使用した Java シリアル化 (HAS-A 関係)

クラスに別のクラスへの参照がある場合、すべての参照がシリアル化可能である必要があります。そうでない場合、シリアル化プロセスは実行されません。このような場合には、 NotSerializableException 実行時にスローされます。

アドレス.java

c 文字列の配列
 class Address{ String addressLine,city,state; public Address(String addressLine, String city, String state) { this.addressLine=addressLine; this.city=city; this.state=state; } } 

Student.java

 import java.io.Serializable; public class Student implements Serializable{ int id; String name; Address address;//HAS-A public Student(int id, String name) { this.id = id; this.name = name; } } 

Address はシリアル化可能ではないため、Student クラスのインスタンスをシリアル化することはできません。

注: オブジェクト内のすべてのオブジェクトはシリアル化可能である必要があります。

静的データメンバーを使用した Java シリアル化

クラス内に静的データ メンバーがある場合、静的はオブジェクトではなくクラスの一部であるため、シリアル化されません。

ブール値を文字列に変換する

従業員.java

 class Employee implements Serializable{ int id; String name; static String company='SSS IT Pvt Ltd';//it won't be serialized public Student(int id, String name) { this.id = id; this.name = name; } } 

配列またはコレクションを使用した Java シリアル化

規則: 配列またはコレクションの場合、配列またはコレクションのすべてのオブジェクトがシリアル化可能である必要があります。シリアル化できないオブジェクトがある場合、シリアル化は失敗します。

Javaで外部化可能

外部化可能なインターフェイスは、オブジェクトの状態を圧縮形式でバイト ストリームに書き込む機能を提供します。マーカーインターフェイスではありません。

外部化可能なインターフェイスには、次の 2 つのメソッドが用意されています。

    public void writeInitial(ObjectOutput out) は IOException をスローします public void readExternal(ObjectInput in) は IOException をスローします

Java 一時キーワード

クラスのデータ メンバーをシリアル化したくない場合は、それを一時的としてマークできます。

従業員.java

 class Employee implements Serializable{ transient int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

現在、id はシリアル化されないため、シリアル化後にオブジェクトを逆シリアル化すると、id の値は取得されません。常にデフォルト値を返します。この場合、id のデータ型は整数であるため、0 が返されます。

詳細については、次のページをご覧ください。

シリアルバージョンUID

実行時のシリアル化プロセスでは、SerialVersionUID として知られる ID を各シリアル化可能クラスに関連付けます。これは、シリアル化されたオブジェクトの送信者と受信者を検証するために使用されます。送信者と受信者は同じである必要があります。それを検証するには、SerialVersionUID が使用されます。送信者と受信者は同じ SerialVersionUID を持っている必要があります。そうでない場合は、 無効なクラス例外 オブジェクトを逆シリアル化するとスローされます。 Serializable クラスで独自の SerialVersionUID を宣言することもできます。これを行うには、フィールド SerialVersionUID を作成し、それに値を割り当てる必要があります。 static と Final を備えた long 型である必要があります。クラス内でserialVersionUIDフィールドを明示的に宣言し、それをプライベートにすることをお勧めします。例えば:

 private static final long serialVersionUID=1L; 

これで、Serializable クラスは次のようになります。

従業員.java

 import java.io.Serializable; class Employee implements Serializable{ private static final long serialVersionUID=1L; int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } }