java的序列化和反序列化

来源:互联网 发布:grub windows引导丢失 编辑:程序博客网 时间:2024/05/20 05:09

首先聊聊为啥要序列化和反序列化。序列化机制允许把内存中的java对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上,通过网络将这种二进制流传输到另一个网络节点。一旦得到这种二进制流,都可以将这种二进制流回复称原来的 java对象。

下面看个demo,注释很详细,可以边看代码边看思想。

Person是一个一般的实体对象,它实现了Serializable接口,我在该类当中显示的指定writeObject(),readObject(),序列化和反序列化时就会调用对应的方法,当然一般我们不会显式的写这几个方法的,因为只要实现Serializable接口,jdk就会帮我们序列化该对象,只是我们指定了writeObject(),readObject(),系统就会调用该方法。

Student同样是一个一般的实体对象,只不过它实现了Externalizable接口,这个接口强制我们重写它下面的两个方法,也就是序列化和反序列化方法,其原理和Person中定义

writeObject(),readObject()一样的。

package com.serializable.test;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;/** * 序列化和反序列化 * 序列化机制允许把内存中的java对象转换成平台无关的二进制流,从而允许把这种二进制流持久的保存在磁盘上, * 通过网络将这种二进制流传输到另一个网络节点。一旦得到这种二进制流,都可以将这种二进制流回复称原来的 * java对象。 * @author gcl * @version 2015年7月8日 * @see SerializableObjectTest * @param  * @since */public class SerializableObjectTest {public static void main(String[] args) {SerializableObjectTest.writeObject();SerializableObjectTest.readObject();}/** * 基本序列化 * Description:序列化 <br> * 被序列化的对象需要实现Serializable或者Externalizable之一 * 序列化 * @see */public static void writeObject(){ObjectOutputStream oos;try {oos = new ObjectOutputStream(new FileOutputStream("d://object.txt"));Person per = new Person("孙悟空", 500,true);oos.writeObject(per);} catch (IOException e) {e.printStackTrace();}}/** * 基本序列化 * 反序列化  将序列化的二进制流文件,在转化成java对象 * 主意序列化只是将数据序列化,而不是java结构,因此 * 反序列化时,需要java对象的class文件 * @see */public static void readObject(){ObjectInputStream ois;try {ois = new ObjectInputStream(new FileInputStream("d://object.txt"));Person per = (Person)ois.readObject();System.out.println("name:"+per.getName()+";age:"+per.getAge()+";sex:"+per.isSex());} catch (IOException | ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}


package com.serializable.test;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.ObjectStreamException;import java.io.Serializable;/** * 序列化和反序列化的对象类 * 除此之外还定义了序列化和反序列化的自定义方法等等, * 除了下面自定仪的三个方法之外,序列化和反序列化还可以 * 自定义许多方法 * @author gcl * @version 2015年7月8日 * @see Person * @param  * @since */public class Person implements Serializable {/** * 意义,目的和功能,以及被用到的地方<br> */private static final long serialVersionUID = 4512975985830141148L;private String name;private int age;/** * transient 标示序列化时不包括该字段,反序列化时, * 该字段将使用初始化值,比如int初始化是0,boolean * 初始化时false * transient 只能用在字段上 */private transient boolean sex;/** * @param name * @param age */public Person(String name, int age,boolean sex) {super();this.name = name;this.age = age;this.sex = sex;}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;}public boolean isSex() {return sex;}public void setSex(boolean sex) {this.sex = sex;}/** * Description: 在序列化之前会先自动调用该方法<br> * @return * @throws ObjectStreamException  * @see */private Object writeReplace() throws ObjectStreamException{System.out.println("序列化之前会被调用");return this;}/** * Description:自定义序列化方法,当序列化时,会自动调用该方法进行序列化 <br> * 这样就可以方便的控制哪些字段需要被序列化,哪些字段不需要序列化, * 除此之外,还可以在序列化时,对某些字段进行处理再序列化 * @param out * @throws IOException  * @see */private void writeObject(ObjectOutputStream out) throws IOException{out.writeObject(name);out.writeInt(age);System.out.println("out");}/** *  * Description: 反序列化时将会自动调用该方法<br> * 反序列化时字段的顺序和序列化的顺序是一直的, * 比如多个int字段,反序列化时就按照序列化的先后 * 顺序进行反序列化读取 * @param in * @throws IOException * @throws ClassNotFoundException  * @see */private void readObject(ObjectInputStream in)throws IOException,ClassNotFoundException{System.out.println("in");this.name = in.readObject().toString();this.age = in.readInt();}}

package com.serializable.test;import java.io.Externalizable;import java.io.IOException;import java.io.ObjectInput;import java.io.ObjectOutput;/** * 实现Externalizable 需要显式的实现 * writeExternal()和readExternal()方法 * 其他和实现Serializable一样 * @author gcl * @version 2015年7月8日 * @see Student * @param  * @since */public class Student implements Externalizable {private int id;private String name;/** * @param id * @param name */public Student(int id, String name) {super();this.id = id;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}/* (non-Javadoc) * @see java.io.Externalizable#writeExternal(java.io.ObjectOutput) */@Overridepublic void writeExternal(ObjectOutput out) throws IOException {System.out.println("序列化");out.writeInt(id);out.writeObject(name);}/* (non-Javadoc) * @see java.io.Externalizable#readExternal(java.io.ObjectInput) */@Overridepublic void readExternal(ObjectInput in) throws IOException,ClassNotFoundException {System.out.println("反序列化"); this.id = in.readInt(); this.name = in.readObject().toString();}@Overridepublic String toString() {return "Student [id=" + id + ", name=" + name + "]";}}


0 0