packagecom.wangjun.othersOfJava;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.Serializable;publicclassSerializeDemo{publicstaticvoidmain(String[]args){Employee em =newEmployee();em.name="wangjun";em.age=24;em.ssh=123456; // 将对象序列化后保存到文件try(FileOutputStream fo =newFileOutputStream("tem.ser");ObjectOutputStream oo =newObjectOutputStream(fo)){oo.writeObject(em);}catch(IOExceptione){e.printStackTrace();} // 反序列化取出对象try(FileInputStream fi =newFileInputStream("tem.ser");ObjectInputStream oi =newObjectInputStream(fi)){Employee e2 =(Employee)oi.readObject();System.out.println(e2.name);System.out.println(e2.age);System.out.println(e2.ssh);System.out.println(Employee.local);e2.test();}catch(Exceptione){e.printStackTrace();}}staticclassEmployeeimplementsSerializable{String name;int age;staticString local ="earth";transientint ssh;publicvoidtest(){System.out.println("this is test method!");}}}
对Externalizable对象反序列化时,会先调用类的不带参数的构造方法,这是有别于默认反序列方式的。如果把类的不带参数的构造方法删除,或者把该构造方法的访问权限设置为private、默认或protected级别,会抛出java.io.InvalidException: no valid constructor异常,因此Externalizable对象必须有默认构造函数,而且必需是public的。
static class Employee implements Externalizable {
String name;
int age;
static String local = "earth";
transient int ssh;
//实现Externalizable接口进行序列化必须显式声明无参构造器
public Employee() {
}
public void test() {
System.out.println("this is test method!");
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(name);
//out.writeObject(age);
out.writeObject(ssh);
out.writeObject(local);
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
name = (String) in.readObject();
//age = (int) in.readObject();
ssh = (int) in.readObject();
local = (String) in.readObject();
}
}
wangjun
0
123456
earth
this is test method!
The serializable class Employee does not declare a static final serialVersionUID field of type long
static class Employee implements Serializable {
String name;
int age;
static String local = "earth";
transient int ssh;
String test;
public void test() {
System.out.println("this is test method!");
}
}
java.io.InvalidClassException: com.wangjun.othersOfJava.SerializeDemo$Employee; local class incompatible: stream classdesc serialVersionUID = 4506166831890198488, local class serialVersionUID = 785960679919880606
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:616)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1843)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1713)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2000)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
at com.wangjun.othersOfJava.SerializeDemo.main(SerializeDemo.java:32)
static class Employee implements Serializable {
private static final long serialVersionUID = 1L;
String name;
int age;
static String local = "earth";
transient int ssh;
public void test() {
System.out.println("this is test method!");
}
}
static class Employee implements Serializable {
private static final long serialVersionUID = 1L;
String name;
int age;
static String local = "earth";
transient int ssh;
String test;
public void test() {
System.out.println("this is test method!");
}
}