Java中的序列化和反序列化

来源:互联网 发布:python read csv 编辑:程序博客网 时间:2024/06/06 05:56

序列化和反序列化


何为序列化?何为反序列化?

解释(概念):

序列化:将对象转化成流的过程称为序列化

反序列化:将流转化成对象的过程称之为反序列化

java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。


怎么使用序列化和反序列化?


根据上面概念可知序列化和反序列都和对象有关。

1. java对象

在java中,想要java对象使用序列化和反序列化,必须让对象类实现java.io.Serializable接口(标记接口,空实现)
例:
public class Student implements Serializable{} 



2.序列化

序列化主要依赖java.io.ObjectOutputStream,该类对java.io.FileOutputStream类进一步的封装,主要使用writeObject(Object obj)方法实现序列化功能。
例:
package io流;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;import java.io.Serializable;/** * 需求: 将对象序列化到盘符文件中 *  * @author xiaojian * */public class Test {public static void main(String[] args) {Person p = new Person("小健",20);try {//创建文件输入流,文件FileOutputStream fos = new FileOutputStream(new File("e:\\obj.obj"));ObjectOutputStream oos = new ObjectOutputStream(fos);//实现序列化    writeObject(Object obj);oos.writeObject(p);//关闭流oos.close();fos.close();}catch (IOException e) {e.printStackTrace();}}}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() {// TODO Auto-generated constructor stub}public Person(String name, int age) {super();this.name = name;this.age = age;}}

结果:(磁盘中)


3.反序列化

反序列化主要依赖java.io.ObjectInputStream,该类对java.io.FileInputStream类进一步的封装,主要使用readObject(Object obj)方法实现序列化功能。
例:(同是刚才序列化的对象,文件)(注意捕获或抛异常)

FileInputStream fis = new FileInputStream(new File("e:\\obj.obj"));ObjectInputStream ois = new ObjectInputStream(fis);Person p = (Person) ois.readObject();System.out.println(p.getName()+":"+p.getAge());




结果:(控制台显示)






序列化·反序列化 完整的代码


package io流;import java.io.File;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 Test_完整 {public static void main(String[] args) throws IOException, ClassNotFoundException {Student s = new Student("小健",20);File file = new File("e:\\obj.obj");//序列writeObject(file,s);//反序列readObject(file);}//反序列化,控制台打印对象属性private static void readObject(File file) throws IOException, IOException, ClassNotFoundException {ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));Student stu = (Student) ois.readObject();System.out.println(stu.getName()+":"+stu.getAge());}//序列化,把对象存储到文件当中private static void writeObject(File file,Student s) throws IOException {ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));oos.writeObject(s);oos.close();}}class Student 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 Student(String name, int age) {super();this.name = name;this.age = age;}public Student() {// TODO Auto-generated constructor stub}}