Java对象序列化

什么是对象序列化?

所谓的对象序列化(在一些书中也称为串行化),是指将对象转换成为二进制数据流的一种实现手段。通过将对象序列化,可以方便的实现对象的传输和存储。


Java对象序列化将那些实现Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象。这一过程甚至可以通过网络进行,这意味着序列化机制能自动弥补不同操作系统之间的差异。也就是说,可以在运行windows系统的计算机上创建一个对象,将其序列化,通过网络将其发送给一台运行Unix系统的计算机,然后准确的重新组装,而却不必担心数据在不同机器上的表示会不同,也不必关心字节的顺序或者其他任何细节。 对象序列化是为了支持两种主要特性。一是Java的远程方法调用(RMI),它使存活于其他计算机上的对象使用起来就像是存活于本机上一样。当向远程对象发送消息时,需要通过对象序列化来传输参数和返回值。

在JAVA中提供有ObjectInputStream与ObjectOutputStream这俩个类用语序列化对象的操作。这俩个类是用于存储和读取对象的输入输出流类,不难想象,只要把对象中的所有成员变量都存储起来,就等于保存了这个对象,之后从保存的对象中在将对象读取进来就可以继续使用此对象。
ObjectInputStream与ObjectOutputStream这俩个类用于完成存储和读取对象成员变量取值的过程,如果一个类的对象想被序列化,则对象所在的类必须实现java.io.Serializable接口。该接口中没有定义任何方法,仅仅被用作一种标记,以被编译器作特殊处理。
public class Person implements Serializable {
	private static final long serialVersionUID = 1L;
	private transient final String name;//如果某个属性不想被序列化,加上transient关键字
	private final int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public String toString() {
		return "姓名:" + this.name + ": 年龄:" + this.age;
	}
}
public class SerializableDemo {
	public static void main(String[] args) {
		File f = new File("D:" + File.separator + "text.txt");
		serialize(f);
		deserialize(f);
	}

	// 序列化对象的方法
	public static void serialize(File f){
		try {
			OutputStream outputFile = new FileOutputStream(f);
			ObjectOutputStream cout = new ObjectOutputStream(outputFile);
			cout.writeObject(new Person("张三", 22));
			cout.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	// 反序列化对象的方法
	public static void deserialize(File f) {
		try {
			InputStream inputFile = new FileInputStream(f);
			ObjectInputStream cin = new ObjectInputStream(inputFile);
			Person p = (Person) cin.readObject();
			System.out.println(p);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

serialVersionUID
在对象进行序列化或反序列化操作的时候,要考虑JDK的版本问题,如果序列化的JDK版本和反序列化的JDK版本不统一则有可能造成异常。所以在序列化操作中引入了 serialVersionUID的常量,可以通过此常量来验证版本的一致性,在进行反序列列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。

序列化一组对象
对象输出时只提供了一个对象的输出操作(writeObject(Object obj)).并没有提供多个对象的输出,所以如果现在要同时序列化多个对象的时候就可以使用对象数组进行操作,因为数组属于引用数据类型,所以可以直接使用Object类型进行接受。这种方法保存的对象有限,Java中引入类集框架解决数组的存储限制问题。

参考书目:java编程思想, java从入门到精通
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值