Javaシーケンス化学習
5250 ワード
一.シーケンス化特徴
1.シーケンス化前のオブジェクトは、通常、瞬時、動的、可変である.シーケンス化後の結果は通常、永続的、静的、可変である.
2.シーケンス化の目的は、通常、オブジェクトを保存したり、転送したりすることである.
3.シーケンス化プロセスは、通常、逆シーケンス化プロセスに対応する.
二.Java Serializable
Javaオブジェクトのメタデータとそのステータスをバイナリ配列として保存します.必要に応じて、バイナリ配列を解析し、オブジェクトを再生成して状態を復元できます.ここでは,対象となる状態を重点的に説明する.オブジェクトのステータスは、実際にはメンバー変数の値であるため、オブジェクトのステータスを保存することは、オブジェクトの値を保存することです.
オブジェクト状態の保存と復元方法を実現した.
方法またはプロセスのリモートコール方法を実現した.
三.serialVersionUIDについて
シーケンス化は、バージョンの互換性を維持するために行われます.すなわち、バージョンのアップグレード時に逆シーケンス化はオブジェクトの一意性を維持します.
2つの生成方法があります.
1つはデフォルトの1 Lです.たとえば、次のようにします.
1つは、クラス名、インタフェース名、メンバーメソッド、およびプロパティなどに基づいて、64ビットのハッシュフィールドを生成します.たとえば、次のようなものです.
四.java.io.Serializableインタフェースの実現
JDKドキュメントを参照
単純テストコード
実行結果
コードの実行中に発生した例外:
参考記事:
Java深度冒険(十)-Javaオブジェクトのシーケンス化とRMI
JAVAにおけるSERIALVERSIONUIDの解釈
Javaシーケンス化の1つ:JAVAシーケンス化とは
Javaシーケンス化のメカニズムと原理、およびカスタムシーケンス化の問題
1.シーケンス化前のオブジェクトは、通常、瞬時、動的、可変である.シーケンス化後の結果は通常、永続的、静的、可変である.
2.シーケンス化の目的は、通常、オブジェクトを保存したり、転送したりすることである.
3.シーケンス化プロセスは、通常、逆シーケンス化プロセスに対応する.
二.Java Serializable
Javaオブジェクトのメタデータとそのステータスをバイナリ配列として保存します.必要に応じて、バイナリ配列を解析し、オブジェクトを再生成して状態を復元できます.ここでは,対象となる状態を重点的に説明する.オブジェクトのステータスは、実際にはメンバー変数の値であるため、オブジェクトのステータスを保存することは、オブジェクトの値を保存することです.
オブジェクト状態の保存と復元方法を実現した.
方法またはプロセスのリモートコール方法を実現した.
三.serialVersionUIDについて
シーケンス化は、バージョンの互換性を維持するために行われます.すなわち、バージョンのアップグレード時に逆シーケンス化はオブジェクトの一意性を維持します.
2つの生成方法があります.
1つはデフォルトの1 Lです.たとえば、次のようにします.
private static final long serialVersionUID = 1L;
1つは、クラス名、インタフェース名、メンバーメソッド、およびプロパティなどに基づいて、64ビットのハッシュフィールドを生成します.たとえば、次のようなものです.
private static final long serialVersionUID = 3688326153694834789L;
四.java.io.Serializableインタフェースの実現
JDKドキュメントを参照
単純テストコード
package com.my.model;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 3688326153694834789L;
private String name;
private int age;
public User(){
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
package com.my.util;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import com.my.model.User;
public class SerializableToFile {
public static void main(String[] args) {
SerializableToFile stf = new SerializableToFile();
stf.save();
stf.resove();
}
public void save() {
User[] user = new User[3];
user[0] = new User("Tom7", 17);
user[1] = new User("Tom8", 18);
user[2] = new User("Tom9", 19);
try {
FileOutputStream fos = new FileOutputStream("D:\\My Documents\\Downloads\\User.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
for (int i = 0; i < user.length; i++) {
System.out.println("<save>User name: " + user[i].getName());
System.out.println("<save>User Age: " + user[i].getAge());
}
oos.writeObject(user);
oos.flush();
oos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void resove() {
try {
FileInputStream fis = new FileInputStream("D:\\My Documents\\Downloads\\User.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
/*
* String name = (String)ois.readObject(); int age = ois.readInt();
*/
try {
User[] user = (User[]) ois.readObject();
if (user != null) {
for (int i = 0; i < user.length; i++) {
System.out.println("<resove>User name: " + user[i].getName());
System.out.println("<resove>User Age: " + user[i].getAge());
}
}
} catch (EOFException e) {
// TODO: handle exception
System.out.println("Read file Done!");
}
ois.close();
} catch (Exception e) {
/*
* if(e instanceof EOFException){
*
* }
*/
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
実行結果
<save>User name: Tom7
<save>User Age: 17
<save>User name: Tom8
<save>User Age: 18
<save>User name: Tom9
<save>User Age: 19
<resove>User name: Tom7
<resove>User Age: 17
<resove>User name: Tom8
<resove>User Age: 18
<resove>User name: Tom9
<resove>User Age: 19
コードの実行中に発生した例外:
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
EOFExceptionをキャプチャする必要がありますwhile (user != null)
結果はデッドサイクルに変更されましたif (user != null)
参考記事:
Java深度冒険(十)-Javaオブジェクトのシーケンス化とRMI
JAVAにおけるSERIALVERSIONUIDの解釈
Javaシーケンス化の1つ:JAVAシーケンス化とは
Javaシーケンス化のメカニズムと原理、およびカスタムシーケンス化の問題