您的位置:首页 > 编程语言 > Java开发

J2SE(八)Java之对象的序列化与反序列化

2016-04-15 14:24 453 查看
什么是序列化与反序列化

序列化是java提供的一种保存对象状态的机制(指实例变量,非方法),将对象转换为字节序列,可以对字节序列进行读写操作。

将字符序列恢复为对象的过程称之为反序列化。

什么情况下使用序列化

a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;

b)当你想用套接字在网络上传送对象的时候;

c)当你想通过RMI传输对象的时候;

注意点:

a)序列化时,只对对象的状态进行保存,而不管对象的方法;

b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;

c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;

d)并非所有的对象都可以序列化,,至于为什么不可以,有很多原因了,比如:

1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行rmi传输 等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。

2. 资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分 配,而且,也是没有必要这样实现。

序列化API:

java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

  只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。

package com.review.Serializable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class People implements Serializable {

private static final long serialVersionUID = -4482502256611631833L;

private int age;

private String name;

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "People [age=" + age + ", name=" + name + "]";
}

// 序列化
public static void serializable(People p) throws IOException {
FileOutputStream fos = new FileOutputStream("people.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p);
oos.close();
fos.close();
}

// 反序列化
public static void deserializable() throws IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream("people.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
People p = (People) ois.readObject();
System.out.println(p.toString());
ois.close();
fis.close();
}

public static void main(String[] args) throws IOException, ClassNotFoundException {
People p=new People();
p.setAge(17);
p.setName("xxx");
serializable(p);
deserializable();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  J2SE