シリアル化に対する外部化の主な利点は、外部化がオブジェクトの一部のみを保持し、シリアル化の場合のようにオブジェクト全体を保持しないことです。しかし、私たちは呼んでない場合、我々は、カスタムのシリアル化を経由して外部化をシミュレートすることができると思いますdefaultWriteObject()のメソッドにObjectOutputStream内のwriteObject()直列化可能クラスのメソッドを。したがって、defaultWriteObject ()メソッドを呼び出しず、writeObject()メソッドでシリアル化可能なクラスの必要なインスタンス変数のみを永続化することなく、外部化の利点を実現できます。
前述のことを示す例を次に示します。
package com.test;
import java.io.*;
public class Test {
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
Dog dog = new Dog();
System.out.println("before serialization: i = " + dog.i + ", j = " + dog.j);
FileOutputStream fos = new FileOutputStream("abc.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(dog);
FileInputStream fis = new FileInputStream("abc.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
Dog dog2 = (Dog) ois.readObject();
System.out.println("after deserialization: i = " + dog2.i + ", j = " + dog2.j);
}
public static class Dog implements Serializable {
int i = 10;
int j = 20;
private void writeObject(ObjectOutputStream oos) throws IOException{
//oos.defaultWriteObject();
System.out.println("In WriteObject");
oos.writeInt(i);
}
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
//ois.defaultReadObject();
System.out.println("In ReadObject");
i = ois.readInt();
}
}
}
このコードの出力は次のとおりです。
before serialization: i = 10, j = 20
In WriteObject
In ReadObject
after deserialization: i = 10, j = 0
ご覧のとおり、oos.defaultWriteObject()
とois.defaultReadObject();
はコメント化されており、インスタンス変数のみを永続化して復元しますi
。
それで、カスタムシリアル化を介して外部化の概念をシミュレートできるという私の仮定は正しいですか?
それで、カスタムシリアル化を介して外部化の概念をシミュレートできるという私の仮定は正しいですか?
あなたの仮定は、プログラマーが彼が選択したクラスのシリアル化されたフォームを構築する能力を持っているということです。
このSerializable
インターフェースは、実装クラスに対してJavaベースのシリアル化が有効になっていることをJavaランタイム環境に通知するマーカーインターフェースです。他に何もしない場合、Javaランタイムはデフォルトのシリアル化機能を呼び出し、クラスのすべてのインスタンスフィールドからシリアル化されたフォームを作成します。
クラスに最適なシリアル化された形式は、次のいずれかです。
たとえば、上記のコードでは、両方の場合i
やj
、あなたのオブジェクトの意味のある状態を説明し、その後、含まれていませんでした直列化された形式は、j
あなたが逆シリアル化後にその意味のある状態にオブジェクトを復元することはできませんので、欠陥があるでしょう。
ただし、i
意味のある状態を記述しj
ているが、オブジェクトの論理状態の一部ではない実装の詳細である場合はj
、より最適なシリアル化された形式を取得するために、ストリームから削除することをお勧めします。
デフォルトのシリアル化されたフォーム(組み込みのJavaシリアル化機能によって発行される)は、単純な値クラスには十分であることがよくありますが、より高度な抽象化には、シリアル化されたフォームの一部になるべきではないメタデータと実装情報が含まれます。
プログラマーがクラスに最適なシリアル化されたフォームを設計できるようにするために(デフォルトのフォームが適切でない場合)、Javaは、オブジェクトに最適なシリアル化されたフォームを生成するための2つの広範なメカニズムを提供します。
Externalizable
インターフェースかつての戦略は、プログラマが内蔵されたJavaのシリアライズ機能使用しての行動変更することができますtransient
キーワードを、とのような方法にフックreadObject()
、writeObject()
、readResolve()
シリアル化プロキシの使用は、特にその必要不可欠不変条件と不変値のクラスのために推奨される、など保護されます。
後者の戦略では、(それ自体が拡張する)のExternalizable
代わりにプログラマーが実装します。異なりインターフェイスは、マーカーインターフェイスではありません。そのメソッドは、実装されると、オブジェクトのシリアル化されたフォームがどのように発行および復元されるかをプログラマーが完全に制御できるようにすることを目的としています。Serializable
Externalizable
Serializable
Externalizable
Serializable
「シリアル化に対する外部化の主な利点は、シリアル化の場合のようにオブジェクト全体ではなく、オブジェクトの一部のみが永続化されることです。」
「オブジェクトの一部」のみを含み、シリアル化される前に存在していたオブジェクトの状態を再構成するために必要なすべての情報を含まないシリアル化されたフォームは、欠陥のあるシリアル化されたフォームです。このような形式は、プロセス間通信をシリアル化に依存しているプラットフォームで問題を引き起こすことが予想されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加