JavaIO之序列化与反序列化

2019-06-15 00:00:00 序列 序列化 化与


一、序列化与反序列化

序列化流(ObjectOutputStream):将Object对象转换成字节序列,主要方法是writeObject()
反序列化流(ObjectInputStream):将原来序列化好的字节序列转换为Object对象,主要方法是readObject()

对象必须实现序列化接口(serializable)才能进行序列化,此接口无任何方法。若一个类实现了序列化,则其子类都可以进行序列化。

新建一个学生类,该类包含3个学生的基本属性、一个无参的构造方法、一个3个参数的构造、属性的getter/setter方法和toString方法。

public class Student implements Serializable{
    private String stuno;
    private String stuname;
    private int stuage;
    public Student(){}

    public Student(String stuno, String stuname, int stuage) {
        super();
        this.stuno = stuno;
        this.stuname = stuname;
        this.stuage = stuage;
    }

    public String getStuno() {
        return stuno;
    }
    public void setStuno(String stuno) {
        this.stuno = stuno;
    }
    public String getStuname() {
        return stuname;
    }
    public void setStuname(String stuname) {
        this.stuname = stuname;
    }
    public int getStuage() {
        return stuage;
    }
    public void setStuage(int stuage) {
        this.stuage = stuage;
    }
    @Override
    public String toString() {
        return "Student [stuno=" + stuno + ", stuname=" + stuname + ", stuage=" + stuage + "]";
    }

对该类进行序列化和反序列化。序列化时要实例化对象,通过序列化流的writeObject方法写入对象;反序列化时,通过反序列化流的readObject方法读出,并强制转换成原类型。代码如下所示。

public class ObjectSeriaDemo {
    public static void main(String[] args)throws Exception {
        String file = "demo/obj.dat";
        //对象的序列化
        ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream(file));
        Student stu = new Student("10001","张三",20);
        oos.writeObject(stu);
        oos.flush();
        oos.close();

        //对象的反序列化
        ObjectInputStream ois = new ObjectInputStream(
                new FileInputStream(file));
        Student s = (Student)ois.readObject();
        System.out.println(s);
        ois.close();
    }

}


二、transient关键字

transient关键字修饰的元素不会进行默认的序列化(反序列化)操作,但可以通过自己完成元素的序列化(反序列化)。

上例中的学生类,若对年龄属性stuage用transient关键字进行修饰,执行序列化流程序后,学生年龄就不会进行默认的序列化,打印出来学生年龄的结果为int类型默认值0。如果需要单独对其进行序列化和反序列化操作,则需要在Student类中加入以下代码。

    //注意是private修饰符
    private void writeObject(java.io.ObjectOutputStream s)throws java.io.IOException{
        s.defaultWriteObject();//先把能默认序列化的元素进行序列化操作
        s.writeInt(stuage);//自己完成序列化操作
    }

    private void readObject(java.io.ObjectInputStream s)throws java.io.IOException,ClassNotFoundException{
        s.defaultReadObject();//先把能默认反序列化的元素进行反序列化
        this.stuage = s.readInt();//自己完成反序列化操作
    }

注:文章根据本站相关课程的学习笔记整理而来,有错误或其他任何问题敬请指正,欢迎共同学习交流!

相关文章