java中对象与字节码的转换称为序列化和饭序列化
应用:将java 对象写入文件
将java对象在网络上进行传输
下面展示测试代码:
package com.wade;
import java.io.Serializable;
public class Person implements Serializable{
/**
* 序列化唯一标识
*/
private static final long serialVersionUID = 1L;
private String Name;
private int age;
private String sex;
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
package com.wade;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Test {
/**
* 将obj对象写入文件
* @param obj
* @throws Exception
*/
public static void writeData(Object obj) throws Exception {
FileOutputStream fos = new FileOutputStream(
"/home/wade/Desktop/data.d");
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(obj);
os.close();
System.out.println("java 对象存储完成");
}
/**
* 从文件中读取对象
* @return
* @throws Exception
*/
public static Object readData() throws Exception {
FileInputStream fis = new FileInputStream("/home/wade/Desktop/data.d");
ObjectInputStream oi = new ObjectInputStream(fis);
Object obj = oi.readObject();
oi.close();
System.out.println("java 对象读取完成");
return obj;
}
public static void main(String[] args) throws Exception {
Person person = new Person();
person.setName("Wade");
person.setAge(20);
//将person写入文件
Test.writeData(person);
//读取person对象
person = (Person) Test.readData();
System.out.println(person.getName());
}
}
执行结果:
java 对象存储完成
java 对象读取完成
Wade
java 对象读取完成
Wade
当java bean中没有显示设置序列号,如果java对象的属性有改变(增加,减少等),这时会导致对于这个对象生成不同的序列号。如果在java bean属性改变之前将实例存入文件,在属性发生改变之后,读取之前存储的实例,这时会出现报错,见如下测试:
Exception in thread "main" java.io.InvalidClassException: com.wade.Person; local class incompatible: stream classdesc serialVersionUID = 2329171088176088046, local class serialVersionUID = -1730403105289999678
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:617)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1622)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
at com.wade.Test.readData(Test.java:33)
at com.wade.Test.main(Test.java:48)
这是由于两次的序列号不匹配导致。