美文网首页Java
java学习笔记#6-对象的序列化与反序列化

java学习笔记#6-对象的序列化与反序列化

作者: edwin1993 | 来源:发表于2017-07-23 19:39 被阅读0次

    序列化就是将object转为byte序列,反之叫做反序列化。

    • 序列化流(ObjectOutputStream):是过滤流,主要方法writeObject
    • 反序列化流(ObjectInputStream):readObject
    • 序列化接口(Serializable):对象必须实现序列化接口才能进行序列化。这个接口没有任何方法,但是却是必须的规定。
    public class Student  implements Serializable{
        private String studentName;
        private String studentAge;
        private String studentNum;
    ...
    
        String file = "./fileIOTestFileFolder/obj.txt";
        public void objectToBytes() throws IOException{
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
            Student studentZhang = new Student("zhang","21","001");
            objectOutputStream.writeObject(studentZhang);
            objectOutputStream.close();
            System.out.println("finish object to bytes. result in obj.txt");
        }
    
        public void bytesToObject() throws IOException, ClassNotFoundException {
            ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));
            Student studentZhang = (Student)objectInputStream.readObject();
            System.out.println(studentZhang);
            objectInputStream.close();
        }
    
    

    transient关键字

    object中,拥有该关键字的属性不会被jvm默认的序列化。但是可以随后自行序列化。

    public class Student  implements Serializable{
        private String studentAge;
        private String studentNum;
        private transient String studentName;
    
    ...
    
        private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{
            s.defaultWriteObject();
            s.writeObject(studentName);//自行完成studentName序列化
        }
    
        private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException {
            s.defaultReadObject();
            this.studentName =(String)s.readObject();//自行完成studentName反序列化
        }
    }
    
    

    其中default为进行JVM默认的序列化操作。

    transient 关键字乍一看很鸡肋,使得我们需要将原本自动完成的内容进行手都编写序列化,但是transient 可以提高序列化的性能。对于一些特殊的对象,比如对象中的一个未满的数组。如果自动序列化,则该数组会全部序列化,但是如果我们的数组只使用了一半,则有一半不需要的部分被序列化了。

    java ArrayList的源码内可以看到相关的一些操作。

    序列化过程中存在子类父类关系时,对子类对象进行反序列化时如果其父类没有实现序列化接口,则其父类的构造函数将会被显式调用。

    相关文章

      网友评论

        本文标题:java学习笔记#6-对象的序列化与反序列化

        本文链接:https://www.haomeiwen.com/subject/hgpekxtx.html