一、java序列化和反序列化
java序列化是指把java对象转化为字节序列的过程;而反序列化是指将字节序列恢复为java对象的过程。
二、为什么需要序列化和反序列化
使用序列化和反序列化的目的是为了能够实现进程间对象的传送;发送方需要将java对象转化为字节序列,而接收方需要从字节序列中恢复成java对象
java序列化的好处:
1、实现数据的持久化
2、利用序列化实现远程通信,即在网络上传送对象的字节序列。
三、如何实现java的序列化和反序列化
1、java.io.ObjectOutputStream:表示对象输出流;主要是序列化对象的使用。
2、java.io.ObjectInputStream:表示对象输入流;主要是反序列化对象的使用。
具体实例:
Person类的定义
public class Person implements Serializable {
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;
}
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
只有实现了Serializable或Externalizable接口的类的对象才能被序列化,否则抛出异常。
实际上在进行对象序列化的时候,序列化的是类中的属性,因为每个类的对象只有属性是不同的。但是如果现在有某个属性不希望被序列化下来的话,则可以使用 transient 关键字。
例如:
private transient String name;
private int age;
public class UsePerson {
public static void main(String[] args) throws Exception{
//序列化过程
Person person = new Person("mike",23);
File file = new File("e:"+File.separator+"person.ini");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject("Hello World"); //序列化普通字符串
oos.writeObject(new Date()); //序列化匿名对象
oos.writeObject(person); //序列化person
oos.close();
//反序列化过程
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
String obj1 = (String)ois.readObject();
Date obj2 = (Date)ois.readObject();
Person obj3 = (Person)ois.readObject();
System.out.println(obj1);
System.out.println(obj2);
System.out.println(obj3);
}
}
为了正确读取数据,完成反序列化,必须保证向对象输出流写对象的顺序与从对象输入流中读对象的顺序一致。
结果:
Hello World
Wed May 03 14:32:41 CST 2017
Person [name=mike, age=23]
四、总结
1、java序列化是把java对象转化成字节序列的形式进行传输;java反序列化是把字节序列恢复成java对象。
2、采用java的序列化和反序列化,一是可以实现数据的持久化,二是能够进行对象数据的远程通信。