java之序列化

© 版权声明:本文为博主原创文章,转载请注明出处

序列化

  1. 必须实现Serializable接口,该接口是一个空实现,只是一个规定

  2. transient修饰的元素不会再进行JVM默认的序列化,但是可以自己进行序列化

  3. transient修饰的元素可能不用序列化,也可能是自己实现序列化提高效率

  4. 若父类实现了Serializable接口,其子类进行序列化时,不会显示调用父类的构造方法;

   若父类未实现Serializable接口,其子类进行序列化时,会显示调用父类的构造方法。

ArrayList中使用transien实例

  1. 打开ArrayList源码可发现elementData元素即是使用transient进行修饰

  2. 查看ArrayList实现序列化的方法,可看见elementData依然进行序列化了,只不过是只序列化有效数据,无效数据不进行序列化,提高效率

实例:

1.项目结构

2.Student.java

package org.java.base.serializable;

import java.io.Serializable;

/**
 * 学生类
 */
public class Student implements Serializable {

    private String stuName;
    private String stuSex;
    private transient int stuAge;// 该元素不会进行JVM默认的序列化,但可自己进行序列化

    public Student(String stuName, String stuSex, int stuAge) {
        this.stuName = stuName;
        this.stuSex = stuSex;
        this.stuAge = stuAge;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public String getStuSex() {
        return stuSex;
    }

    public void setStuSex(String stuSex) {
        this.stuSex = stuSex;
    }

    public int getStuAge() {
        return stuAge;
    }

    public void setStuAge(int stuAge) {
        this.stuAge = stuAge;
    }

    @Override
    public String toString() {
        return "Student{" +
                "stuName='" + stuName + '\'' +
                ", stuSex='" + stuSex + '\'' +
                ", stuAge=" + stuAge +
                '}';
    }

    /**
     * 自定义进行序列化
     *
     * @param s
     *
     * @throws java.io.IOException
     */
    private void writeObject(java.io.ObjectOutputStream s)
            throws java.io.IOException {

        s.defaultWriteObject();// 把JVM能默认序列化的元素进行序列化操作
        s.writeInt(stuAge + 1);// 自己完成stuAge的序列化

    }

    /**
     * 自定义进行反序列化
     *
     * @param s
     *
     * @throws java.io.IOException
     *
     * @throws ClassNotFoundException
     */
    private void readObject(java.io.ObjectInputStream s)
            throws java.io.IOException, ClassNotFoundException {

        s.defaultReadObject();// 把JVM能默认反序列化的元素进行反序列化操作
        this.stuAge = s.readInt();// 自己完成stuAge的反序列化

    }

}

3.StuSerializable.java

package org.java.base.serializable;

import java.io.*;

/**
 * 序列化与反序列化
 */
public class StuSerializable {

    public static void main(String[] args) throws Exception {

        StuSerializable ss = new StuSerializable();
        ss.createSerializeFile("demo\\obj.dat");
        ss.stuDeserialize("demo\\obj.dat");

    }

    /**
     * 序列化,并保存到文件中
     *
     * @param fileName
     *                      文件名
     * @throws IOException
     */
    private void createSerializeFile(String fileName) throws IOException {

        ObjectOutputStream oos = new ObjectOutputStream(
                new FileOutputStream(fileName));
        Student stu = new Student("张三", "男", 25);
        oos.writeObject(stu);
        oos.close();

    }

    /**
     * 反序列化
     *
     * @param fileName
     *                  文件名
     * @throws Exception
     */
    private void stuDeserialize(String fileName) throws Exception {

        ObjectInputStream ois = new ObjectInputStream(
                new FileInputStream(fileName));
        Student stu = (Student) ois.readObject();
        System.out.println(stu);

    }

}

4. 效果预览

 

 参考:http://www.imooc.com/learn/123

posted @ 2017-08-07 15:16  禁忌夜色153  阅读(215)  评论(0编辑  收藏  举报