Javaシーケンス化(1)
1.シーケンス化とは何ですか.
簡単に言えば、メモリに保存する各種オブジェクトの状態(すなわち、インスタンス変数であり、方法ではない)のために、保存するオブジェクトの状態を再読することができる.自分の様々な方法でobject statesを保存することができますが、javaはあなた自身よりもオブジェクトの状態を保存するメカニズムを提供します.それはシーケンス化です.
2.シーケンス化が必要な場合は?
a)メモリ内のオブジェクトの状態を1つのファイルまたはデータベースに保存したい場合.
b)ソケットでネットワーク上でオブジェクトを転送したい場合.
c)RMIを介してオブジェクトを転送したい場合.
3.オブジェクトをシーケンス化するとき、空間に何が起こりますか?
シーケンス化前に、ヒープ(Heap)に保存する各オブジェクトには、対応する状態(state)、すなわちインスタンス変数(instance ariable)がある.
次のようになります.
以下のコードでシーケンス化すると、MyFooオブジェクトのwidthおよびheightインスタンス変数の値(37,70)がfooに保存される.serファイルでは、後でそれをファイルから読み出す、スタックに元のオブジェクトを再作成することができます.もちろん、保存時にはオブジェクトのインスタンス変数値を保存するだけでなく、JVMにはクラスのタイプなど、小さな情報を保存して元のオブジェクトを復元する必要があります.
次のようになります.
4.シーケンス化(ファイルに保存)を実現するには
次のようになります.
5.例
次のようになります.
6.注意事項
a)シーケンス化の場合、オブジェクトの方法にかかわらず、オブジェクトの状態のみを保存する.
b)親クラスがシーケンス化を実現すると、子クラスは自動的にシーケンス化を実現し、Serializableインタフェースを表示する必要がない.
c)あるオブジェクトのインスタンス変数が他のオブジェクトを参照する、そのオブジェクトをシーケンス化する際にも参照オブジェクトをシーケンス化する.
d)すべてのオブジェクトがシーケンス化できるわけではないが,なぜできないのかには多くの原因がある.
次のようになります.
1.セキュリティ上の理由としては、オブジェクトがprivate、publicなどのfieldを有する、ファイルへの書き込みやRMIの転送など、転送対象のオブジェクトに対して、シーケンス化による転送の過程で、そのオブジェクトのprivateなどのドメインは保護されない.
2.socket,threadクラスのようなリソース割当の理由は、シーケンス化、転送または保存が可能であれば、それらを再リソース割当することもできず、そのように実現する必要もない.
簡単に言えば、メモリに保存する各種オブジェクトの状態(すなわち、インスタンス変数であり、方法ではない)のために、保存するオブジェクトの状態を再読することができる.自分の様々な方法でobject statesを保存することができますが、javaはあなた自身よりもオブジェクトの状態を保存するメカニズムを提供します.それはシーケンス化です.
2.シーケンス化が必要な場合は?
a)メモリ内のオブジェクトの状態を1つのファイルまたはデータベースに保存したい場合.
b)ソケットでネットワーク上でオブジェクトを転送したい場合.
c)RMIを介してオブジェクトを転送したい場合.
3.オブジェクトをシーケンス化するとき、空間に何が起こりますか?
シーケンス化前に、ヒープ(Heap)に保存する各オブジェクトには、対応する状態(state)、すなわちインスタンス変数(instance ariable)がある.
次のようになります.
Foo myFoo=new Foo();
myFoo.setWidth(37);
myFoo.setHeight(70);
以下のコードでシーケンス化すると、MyFooオブジェクトのwidthおよびheightインスタンス変数の値(37,70)がfooに保存される.serファイルでは、後でそれをファイルから読み出す、スタックに元のオブジェクトを再作成することができます.もちろん、保存時にはオブジェクトのインスタンス変数値を保存するだけでなく、JVMにはクラスのタイプなど、小さな情報を保存して元のオブジェクトを復元する必要があります.
次のようになります.
FileOutputStream fs=new FileOutputStatem("foo.ser");
ObjectOutputStream os=new ObjectOutputStream(fs);
os.writeObject(myFoo);
4.シーケンス化(ファイルに保存)を実現するには
次のようになります.
// FileOutputStream
FileOutputStream fs=new FileOutputStream("foo.ser");
// ObjectOutputStream
ObjectOutputStream os=new ObjectOutputStream(fs);
//
os.writeObject(obj);
// os.close();
5.例
次のようになります.
import java.io.*;
public class Box implements Serializable
{
private int width;
private int height;
public void setWidth(int width){
this.width = width;
}
public void setHeight(int height){
this.height = height;
}
public static void main(String[] args){
Box myBox = new Box();
myBox.setWidth(50);
myBox.setHeight(30);
try{
FileOutputStream fs = new FileOutputStream("foo.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(myBox);
os.close();
}catch(Exception ex){
ex.printStackTrace();
}
}
}
6.注意事項
a)シーケンス化の場合、オブジェクトの方法にかかわらず、オブジェクトの状態のみを保存する.
b)親クラスがシーケンス化を実現すると、子クラスは自動的にシーケンス化を実現し、Serializableインタフェースを表示する必要がない.
c)あるオブジェクトのインスタンス変数が他のオブジェクトを参照する、そのオブジェクトをシーケンス化する際にも参照オブジェクトをシーケンス化する.
d)すべてのオブジェクトがシーケンス化できるわけではないが,なぜできないのかには多くの原因がある.
次のようになります.
1.セキュリティ上の理由としては、オブジェクトがprivate、publicなどのfieldを有する、ファイルへの書き込みやRMIの転送など、転送対象のオブジェクトに対して、シーケンス化による転送の過程で、そのオブジェクトのprivateなどのドメインは保護されない.
2.socket,threadクラスのようなリソース割当の理由は、シーケンス化、転送または保存が可能であれば、それらを再リソース割当することもできず、そのように実現する必要もない.