Java中的序列化与反序列化

来源:互联网 发布:伏地魔魔杖数据 编辑:程序博客网 时间:2024/06/04 23:55
①什么时候需要使用序列化与反序列化
——一个对象存活时间不会比JVM还要长,但是当我们需要让一个对象在JVM停止运行之后还能持久保存,并且将来可以重新读取使用
——两个进程之间需要相互传送对象时也要使用序列化,一方面,发送方需要把这个Java对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中恢复出Java对象。
②序列化与反序列化
Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程
③JDK类库中序列化的API
 java.io.ObjectOutputStream:表示对象输出流
它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream:表示对象输入流
它的readObject()方法源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回。
④怎么实现序列化
实现了Serializable或Externalizable接口的类的对象才能被序列化,否则抛出异常
⑤当一个类实现序列化后不想他全部成员都被序列化,我们要用transient关键字修饰


下面是一个例子,Student类实现了Serializable接口

import java.io.Serializable;import java.util.Calendar;public class Student implements Serializable {    String name;    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 String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }    public Calendar getBir() {        return bir;    }    public void setBir(Calendar bir) {        this.bir = bir;    }    String sex;    Calendar bir;}
测试类Main,将Student对象保存到文件中,实现序列化,再将对象读取出来,实现反序列化
import java.io.*;import java.util.Calendar;import java.util.HashMap;public class Main {    public static void main(String[] args) {        Calendar cal=Calendar.getInstance();        cal.clear();        cal.set(Calendar.YEAR,2014);        cal.set(Calendar.MONTH,03);        Student stu1=new Student();        stu1.setAge(3);        stu1.setBir(cal);        stu1.setSex("男");        stu1.setName("小明");        File file=new File("/Users/apple/Documents/序列化/java.pages");        try{//Student序列化过程            FileOutputStream fos = new FileOutputStream(file);            ObjectOutputStream oos = new ObjectOutputStream(fos);            oos.writeObject(stu1);            oos.flush();            oos.close();            fos.close();            //Student对象反序列化过程            FileInputStream fis = new FileInputStream(file);            ObjectInputStream ois = new ObjectInputStream(fis);            Student st1 = (Student) ois.readObject();            System.out.println("name = " + st1.getName());            System.out.println("sex = " + st1.getSex());            System.out.println("age = "+ stu1.getAge());            System.out.println("birthday ="+ stu1.getBir());            ois.close();            fis.close();        }catch (IOException ioe){            System.out.println("ioe");        }catch(ClassNotFoundException filee)        {            System.out.println("file");        }    }}
控制台输出结果


如果Student类中的Name属性被关键字transient修饰,那么Name就不能被序列化

运行结果如下图:name为空,不能被序列化和反序列化



希望对大家有帮助!!!




原创粉丝点击