javaオブジェクトの順序付けを実行します。
9402 ワード
今日はソースコードを見ていますが、BaseEntityがプログレッシブインターフェースを実現しました。以前は他人のまねをして、実体上の序列化インターフェースを実現していました。序列化の意味をよりよく理解するために、javaオブジェクトの序列化をまとめます。
javaオブジェクトがメモリからディスクに書き込まれた場合、以下の手順があります。
(1)Object OutputStreamオブジェクトを宣言し、Object OutputStreamオブジェクトを構築する際に、FileOutputStreamオブジェクトパラメータを転送します。FileOutputStreamオブジェクトを作成する場合、ファイルやファイルパスパラメータを転送します。
(2)オブジェクトを構成し、Object OutputStreamのwriteObject方式でストリームに書き込みます。
java.io.Not Serialzable Exception:net.chinaedo.project.g 3 mini.Person
at java.io.Object OutputStream.writeObject 0(Object Output Stream.java:1164)
at java.io.Object OutputStream.writeObject(Object OutputStream.java:330)
at.chinaedu.projects.g 3 mini.Test.main(Test.java:27)
エラー結果からObject OutputStream.writeObjectメソッドのエラーを解析できます。writeObject方法のソースコード:
アンチプログレッシブファイルを読みだします。
javaオブジェクトがメモリからディスクに書き込まれた場合、以下の手順があります。
(1)Object OutputStreamオブジェクトを宣言し、Object OutputStreamオブジェクトを構築する際に、FileOutputStreamオブジェクトパラメータを転送します。FileOutputStreamオブジェクトを作成する場合、ファイルやファイルパスパラメータを転送します。
(2)オブジェクトを構成し、Object OutputStreamのwriteObject方式でストリームに書き込みます。
import java.util.Date;
public abstract class BaseEntity {
private String id;
private Date createTime;
private Date modifyTime;
private Date deleteTime;
private String createUser;
private String modifyUser;
private String deleteUser;
private int deleteFlag = 2;
private boolean checked = false;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getModifyTime() {
return modifyTime;
}
public void setModifyTime(Date modifyTime) {
this.modifyTime = modifyTime;
}
public Date getDeleteTime() {
return deleteTime;
}
public void setDeleteTime(Date deleteTime) {
this.deleteTime = deleteTime;
}
public String getCreateUser() {
return createUser;
}
public void setCreateUser(String createUser) {
this.createUser = createUser;
}
public String getModifyUser() {
return modifyUser;
}
public void setModifyUser(String modifyUser) {
this.modifyUser = modifyUser;
}
public String getDeleteUser() {
return deleteUser;
}
public void setDeleteUser(String deleteUser) {
this.deleteUser = deleteUser;
}
public int getDeleteFlag() {
return deleteFlag;
}
public void setDeleteFlag(int deleteFlag) {
this.deleteFlag = deleteFlag;
}
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
}
public class Person extends BaseEntity {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString(){
return "name:"+this.getName()+
"age:"+this.getAge()+
"checked:"+this.isChecked()+
"createTime:"+this.getCreateTime();
}
}
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Date;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
//
Person p1=new Person();
p1.setAge(1);
p1.setChecked(true);
p1.setCreateTime(new Date());
p1.setName("liming");
FileOutputStream fos=null;
ObjectOutputStream oos=null;
try {
fos=new FileOutputStream("person1.txt");
oos=new ObjectOutputStream(fos);
oos.writeObject(p1);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(oos!=null){
try {
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
実行結果は:java.io.Not Serialzable Exception:net.chinaedo.project.g 3 mini.Person
at java.io.Object OutputStream.writeObject 0(Object Output Stream.java:1164)
at java.io.Object OutputStream.writeObject(Object OutputStream.java:330)
at.chinaedu.projects.g 3 mini.Test.main(Test.java:27)
エラー結果からObject OutputStream.writeObjectメソッドのエラーを解析できます。writeObject方法のソースコード:
/**
* Underlying writeObject/writeUnshared implementation.
*/
private void writeObject0(Object obj, boolean unshared)
throws IOException
{
boolean oldMode = bout.setBlockDataMode(false);
depth++;
try {
// handle previously written and non-replaceable objects
int h;
if ((obj = subs.lookup(obj)) == null) {
writeNull();
return;
} else if (!unshared && (h = handles.lookup(obj)) != -1) {
writeHandle(h);
return;
} else if (obj instanceof Class) {
writeClass((Class) obj, unshared);
return;
} else if (obj instanceof ObjectStreamClass) {
writeClassDesc((ObjectStreamClass) obj, unshared);
return;
}
// check for replacement object
Object orig = obj;
Class cl = obj.getClass();
ObjectStreamClass desc;
for (;;) {
// REMIND: skip this check for strings/arrays?
Class repCl;
desc = ObjectStreamClass.lookup(cl, true);
if (!desc.hasWriteReplaceMethod() ||
(obj = desc.invokeWriteReplace(obj)) == null ||
(repCl = obj.getClass()) == cl)
{
break;
}
cl = repCl;
}
if (enableReplace) {
Object rep = replaceObject(obj);
if (rep != obj && rep != null) {
cl = rep.getClass();
desc = ObjectStreamClass.lookup(cl, true);
}
obj = rep;
}
// if object replaced, run through original checks a second time
if (obj != orig) {
subs.assign(orig, obj);
if (obj == null) {
writeNull();
return;
} else if (!unshared && (h = handles.lookup(obj)) != -1) {
writeHandle(h);
return;
} else if (obj instanceof Class) {
writeClass((Class) obj, unshared);
return;
} else if (obj instanceof ObjectStreamClass) {
writeClassDesc((ObjectStreamClass) obj, unshared);
return;
}
}
// remaining cases
if (obj instanceof String) {
writeString((String) obj, unshared);
} else if (cl.isArray()) {
writeArray(obj, desc, unshared);
} else if (obj instanceof Enum) {
writeEnum((Enum) obj, desc, unshared);
} else if (obj instanceof Serializable) {
writeOrdinaryObject(obj, desc, unshared);
} else {
if (extendedDebugInfo) {
throw new NotSerializableException(
cl.getName() + "
" + debugInfoStack.toString());
} else {
throw new NotSerializableException(cl.getName());
}
}
} finally {
depth--;
bout.setBlockDataMode(oldMode);
}
}
この中の一部のコードは、次の通りobjタイプを判断するものです。if (obj instanceof String) {
writeString((String) obj, unshared);
} else if (cl.isArray()) {
writeArray(obj, desc, unshared);
} else if (obj instanceof Enum) {
writeEnum((Enum) obj, desc, unshared);
} else if (obj instanceof Serializable) {
writeOrdinaryObject(obj, desc, unshared);
} else {
if (extendedDebugInfo) {
throw new NotSerializableException(
cl.getName() + "
" + debugInfoStack.toString());
} else {
throw new NotSerializableException(cl.getName());
}
}
まず、オブジェクトがString、Aray、Enumであるかどうかを判断します。以上がない場合は、オブジェクトがSerializableであるかどうかを判断します。いいえ、書き込み方法の内部にはthrowがあります。 Not Serializable Exception。アンチプログレッシブファイルを読みだします。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
public class ReadPerson1Test {
/**
*
*/
public static void main(String[] args) {
FileInputStream fis=null;
ObjectInputStream ois=null;
try {
fis=new FileInputStream("F:/101edu/svn-work/svn-shiyanban/trunk/dev/src/cedu.g3mini/src/main/java/net/chinaedu/projects/g3mini/person1.txt");
ois=new ObjectInputStream(fis);
Person p=(Person) ois.readObject();
System.err.println(p.toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}