Java中的序列化与反序列化

①什么时候需要使用序列化与反序列化
——一个对象存活时间不会比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为空,不能被序列化和反序列化



希望对大家有帮助!!!




猜你喜欢

转载自blog.csdn.net/varissss/article/details/78837445