美文网首页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-序列化-反序列化

    Thanks Java基础学习总结——Java对象的序列化和反序列化java序列化反序列化原理Java 序列化的高...

  • Java序列化

    Java序列化的几种方式以及序列化的作用 Java基础学习总结——Java对象的序列化和反序列化

  • 《成神之路-基础篇》Java基础知识——序列化(已完结)

    Java对象的序列化与反序列化 介绍了序列化与反序列化的基本用法 深入分析Java的序列化与反序列化 介绍了wri...

  • 序列化

    序列化 学习资料 Java对象的序列化与反序列化-HollisChuang’s Blog 《成神之路-基础篇》Ja...

  • java专题之序列化

    一、基本概念 1、什么是序列化和反序列化 (1)Java序列化是指把Java对象转换为字节序列的过程,而Java反...

  • 序列化与反序列化

    Java基础学习总结——Java对象的序列化和反序列化 一、序列化和反序列化的概念 把对象转换为字节序列的过程称为...

  • 2022-07-12

    什么是序列化与反序列化 Java 序列化是指把 Java 对象转换为字节序列的过程。 Java 反序列化是指把字节...

  • 序列化与反序列化

    1.什么是序列化与反序列化: a.序列化就是把Java对象转为字节序列的过程;反序列化是字节序列恢复为Java对象...

  • Java序列和反序列,看这一篇就够了

    前言 java的序列化和反序列化内容是java学习的基础之一,java的序列化常见于网络中的对象传输以及内存对象持...

  • 序列化与反序列化1

    一、什么是序列化与反系列化? 序列化是将对象转换为二进制形式的数据(如Java中的byte数组),反序列化是再将二...

网友评论

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

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