JAVA序列化

来源:互联网 发布:魔兽插件mac版 编辑:程序博客网 时间:2024/06/04 22:06

1、什么是序列化

序列化就是把对象转换成字节方便存储以及传递,并且可以在从字节重构对象的一种机制。

2、序列化的作用:

分布式处理中对象的传递。负载均衡以及故障转移

3、serializable接口:

java 中一个对象要声明为可序列化的对象,只要继承Serializable接口就可以了。Serializable接口不含有任何方法。

一个对象被序列化,则其中的所有实例变量要么是基本类型,要么是可序列化的。而对于不可序列化或者我们不想序列化的变量可以用transient声明。

4、一个序列化例子

public class Employee implements Serializable{        private String name;        private double salary;}ObjectOutputStream out = new ObjectOutputStream(Files.newOutputStream(Path));Employee peter = new Employee("peter",90000);out.writeObject(peter)

反序列化

ObjectInputSteam in = new ObjectInputSteam(Files.newInputSteam(Path));Employee peter = (Employee)in.readObject();


这里有一点需要注意当两个对象引用了同一个对象的时候,当要读回这两个对象的时候他们也要引用的是同一个对象。

要做到这一点,我们需要有一个序列化号,假设A,B同时引用了C,那么序列化A的时候C也被序列化了,序列化B的时候我们检查发现C已经被序列化了。那这时候只在B中保存一个序列化号

5、readObject和writeObject方法

由于某些特殊需求我们可以重写这两个方法。我们可以在默认的读写行为上加上任意的操作。

比如Point2D这个类是不可序列化的

public class LabeledPoint implements Serializable{          private String label;          private transient Point2D point;...}private void writeObject(ObjectOutputStream out){           out.defaultWriteObject();           out.writeDouble(point.getX());           out.writeDouble(point.getY());}
<pre name="code" class="java">private void readObject(ObjectInputSteam in){           in.defaultReadObject();           double x = in.readDouble();           double y = in.readDouble();           point = new Point2D(x,y);}





0 0
原创粉丝点击