以有序的字节数组形式描述java对象,
包括对象的描述信息(类名,字段信息等)和当前值状态
对java对象进行持久化,保持对象状态
进行网络传输或存储到文件中
序列化只和类有状态的信息有关,其他的信息不必要进行
序列化,如方法的描述。
实现Serializable接口
serialVersionUID:主要是反序列化时校验版本一致性。
序列化时会将该值存储到字节中,如果中间对该类的该
值进行修改,即使其他属性都未动,则反序列化时也会
抛异常
序列化的开始都会写一个header信息,在实例化ObjectOutputStream的时候
,也就是在ObjectOutputStream的构造函数中会调用下面的方法
序列化属性信息:
序列化属性值
上面的方法都是ObjectOutputStream类里的方法源码
下面序列化和反序列化的例子
定义一个普通的object,实现Serializable接口
序列化代码:
可以以HEX格式打开person.txt文件查看下序列化内容,
反序列化代码:
包括对象的描述信息(类名,字段信息等)和当前值状态
对java对象进行持久化,保持对象状态
进行网络传输或存储到文件中
序列化只和类有状态的信息有关,其他的信息不必要进行
序列化,如方法的描述。
实现Serializable接口
serialVersionUID:主要是反序列化时校验版本一致性。
序列化时会将该值存储到字节中,如果中间对该类的该
值进行修改,即使其他属性都未动,则反序列化时也会
抛异常
序列化的开始都会写一个header信息,在实例化ObjectOutputStream的时候
,也就是在ObjectOutputStream的构造函数中会调用下面的方法
protected void writeStreamHeader() throws IOException {
//STREAM_MAGIC = 0xaced
bout.writeShort(STREAM_MAGIC);
//STREAM_VERSION= 5
bout.writeShort(STREAM_VERSION);
}
序列化属性信息:
void writeNonProxy(ObjectOutputStream out) throws IOException {
//类名,全路径
out.writeUTF(name);
//serialVersionUID值
out.writeLong(getSerialVersionUID());
byte flags = 0;
if (externalizable) {
flags |= ObjectStreamConstants.SC_EXTERNALIZABLE;
int protocol = out.getProtocolVersion();
if (protocol != ObjectStreamConstants.PROTOCOL_VERSION_1) {
flags |= ObjectStreamConstants.SC_BLOCK_DATA;
}
} else if (serializable) {
flags |= ObjectStreamConstants.SC_SERIALIZABLE;
}
if (hasWriteObjectData) {
flags |= ObjectStreamConstants.SC_WRITE_METHOD;
}
if (isEnum) {
flags |= ObjectStreamConstants.SC_ENUM;
}
out.writeByte(flags);
//field个数
out.writeShort(fields.length);
//逐个写field的描述,类型,名称
for (int i = 0; i < fields.length; i++) {
ObjectStreamField f = fields[i];
out.writeByte(f.getTypeCode());
out.writeUTF(f.getName());
if (!f.isPrimitive()) {
out.writeTypeString(f.getTypeString());
}
}
}
序列化属性值
private void writeSerialData(Object obj, ObjectStreamClass desc)
throws IOException
{
//分对象属性,和基本类型属性
}
上面的方法都是ObjectOutputStream类里的方法源码
下面序列化和反序列化的例子
定义一个普通的object,实现Serializable接口
public class Person implements Serializable{
/****/
private static final long serialVersionUID = -1981175818469985415L;
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;
}
}
序列化代码:
FileOutputStream fos = new FileOutputStream("E:\\person.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Person p = new Person();
p.setAge(25);
p.setName("bird");
oos.writeObject(p);
oos.flush();
oos.close();
fos.close();
可以以HEX格式打开person.txt文件查看下序列化内容,
反序列化代码:
FileInputStream fis = new FileInputStream("E:\\person.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Person p = (Person) ois.readObject();
//输出 bird:25
System.out.println(p.getName()+":"+p.getAge());
ois.close();
fis.close();