Javaオブジェクトフローによるオブジェクトのシーケンス化
1つのプログラムが実行されると、変数データはメモリに保存され、プログラムが終了するとこれらのデータは保存されません.1つの解決策は、データをファイルに書き込むことです.Javaでは、プログラム内のオブジェクトをファイルに書き込んでから、ファイルからオブジェクトを読み出して再構築するメカニズムが提供されています.これは,いわゆるオブジェクトシーケンス化Javaに導入されたものであり,主にRMI(Remote Method Invocation)やJava Beanのために用いられるが,通常の応用においても有用な技術である.
オブジェクトのシーケンス化が必要なすべてのオブジェクトは、まずSerializableインタフェースを実装する必要があります.次に例を示します.
クラスLogonは、ログイン情報を記録するクラスで、ユーザー名とパスワードが含まれます.まずインタフェースSerializableを実現し、シーケンス化できることを示します.その後mainメソッドでObjectOutputStreamo=new ObjectOutputStream(new FileOutputStream(「Logon.out」)オブジェクトのシーケンス化の宛先がファイルLogon.outであることを示すファイルストリームを新しいオブジェクト出力ストリームにパッケージします.次にメソッドwriteObjectで書き込みを開始します.復元したい時も簡単ですObjectInputStream in=new ObjectInputStream(new FileInputStream(「Logon.out」)新しいオブジェクト入力ストリームをファイルストリームLogon.outをパラメータとして作成し、readObjectメソッドを呼び出せばよい.
オブジェクトのシーケンス化には不思議な点があります.オブジェクトネットワークが構築され、現在シーケンス化するオブジェクトに保持されている参照が指すオブジェクトが含まれてファイルに書き込まれます.さらに奇妙なことに、一度に複数のオブジェクトをシーケンス化すると、同じ内容が共有されて書き込まれます.これは確かに非常に良いメカニズムです.深層コピーを実現するために使用することができ、深層コピーに関する問題はJavaWorldにいくつかの実現方法の紹介と比較を行った文章があり、興味のある人は見てみることができます.
キーワードtransientは、ここでは、現在のコンテンツがシーケンス化されないことを示します.例えば、例のパスワードは秘密にする必要があるので、ファイルに書き込まれていません.
オブジェクトのシーケンス化が必要なすべてのオブジェクトは、まずSerializableインタフェースを実装する必要があります.次に例を示します.
import java.io.*;
import java.util.*;
public class Logon implements Serializable {
private Date date = new Date();
private String username;
private transient String password;
Logon(String name, String pwd) {
username = name;
password = pwd;
}
public String toString() {
String pwd = (password == null ) ? "(n/a)" : password;
return "logon info:
" + "username: " + username + "
date: " + date + "
password: " + pwd;
}
public static void main(String[] args) throws IOException , ClassNotFoundException {
Logon a = new Logon("Morgan" , "morgan83" );
System .out.println( "logon a = " + a);
ObjectOutputStream o = new ObjectOutputStream ( new FileOutputStream ("Logon.out" ));
o.writeObject(a);
o.close();
int seconds = 5;
long t = System .currentTimeMillis() + seconds * 1000;
while (System .currentTimeMillis() < t) ;
ObjectInputStream in = new ObjectInputStream ( new FileInputStream ("Logon.out" ));
System .out.println( "Recovering object at " + new Date());
a = (Logon)in.readObject();
System .out.println("logon a = " + a);
}
}
クラスLogonは、ログイン情報を記録するクラスで、ユーザー名とパスワードが含まれます.まずインタフェースSerializableを実現し、シーケンス化できることを示します.その後mainメソッドでObjectOutputStreamo=new ObjectOutputStream(new FileOutputStream(「Logon.out」)オブジェクトのシーケンス化の宛先がファイルLogon.outであることを示すファイルストリームを新しいオブジェクト出力ストリームにパッケージします.次にメソッドwriteObjectで書き込みを開始します.復元したい時も簡単ですObjectInputStream in=new ObjectInputStream(new FileInputStream(「Logon.out」)新しいオブジェクト入力ストリームをファイルストリームLogon.outをパラメータとして作成し、readObjectメソッドを呼び出せばよい.
オブジェクトのシーケンス化には不思議な点があります.オブジェクトネットワークが構築され、現在シーケンス化するオブジェクトに保持されている参照が指すオブジェクトが含まれてファイルに書き込まれます.さらに奇妙なことに、一度に複数のオブジェクトをシーケンス化すると、同じ内容が共有されて書き込まれます.これは確かに非常に良いメカニズムです.深層コピーを実現するために使用することができ、深層コピーに関する問題はJavaWorldにいくつかの実現方法の紹介と比較を行った文章があり、興味のある人は見てみることができます.
キーワードtransientは、ここでは、現在のコンテンツがシーケンス化されないことを示します.例えば、例のパスワードは秘密にする必要があるので、ファイルに書き込まれていません.