首页 > 代码库 > Java序列化与对象流浅谈

Java序列化与对象流浅谈

 今晚又重新回顾了Java中序列化与对象流的知识,接触了一位有着上亿行有效代码量的大佬之思想,2333

1.序列化与反序列化

Java中的序列化简而言之就是为了避免要重复使用的实例在每次执行程序过程中都要重新申请堆空间,序列化后直接加载,节约时间。序列化过程中,保存在文件中的对象只记录了对象的状态(属性),包括成员和类类型(名称),而不会存储对象的方法。可看做将一个有着灵魂的人进行灵魂转移,转移的只是他的记忆,他自己的各种行为,比如吃饭、睡觉……,每个人都拥有,且行为表现一样,即只需转移(保存)的他的记忆(属性)。贴一段代码:

首先定义一个Person对象

package stu.xyq.Demoview;

import java.io.Serializable;

public class Person implements Serializable{
    /**
     * 
     */
    private static final long serialVersionUID = 6699310621433039735L;
    private String name;
    private String sex;
    private String id;
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Person() {
    }
}
/*这里实现接口Serializable,产生序列号。 *实例化该对象,并将其存入Obj.obj文件中,完成实例化:
*/ ObjectOutputStream out
= new ObjectOutputStream(new FileOutputStream(new File("F:\\JavaSE_App\\workplace2\\Swing复习\\src\\stu\\xyq\\Obj.obj")));//创建一个文件输出流,并将指定抽象文件以参数在实例化时传入 Person me = new Person(); me.setId("01151028"); me.setName("徐徐徐"); me.setSex("男"); out.writeObject(me); out.close();

反序列化化过程如下。读取保存的对象的类型(名称)、属性,程序运行中新new()出一个Obj的实例,再将读取到的数据塞入新实例中。步骤和以上程序对偶。

序列化、反序列化用到的机理为:Java中的对象全是二进制字节数据。

2.对象流

Java中各种以stream为结尾的对象均为字节流。学习对象流之前首先要记住四点:InputStream为字节输入流的抽象父类、OutputStream为字节输出流的抽象父类、所有的输出流构造器中的参数指的是“目的地”,实例的对象调用的write()方法中的参数为数据源所有的输入流构造器中的参数指的是“数据源”,实例的对象调用的read()方法中的参数为目的地。贴段代码实验一下,实践是检验真理的唯一标准~

 

public static void systemIn() throws IOException{
        DataInputStream ois = new DataInputStream(System.in);
        BufferedInputStream bis = new BufferedInputStream(ois);
        
        while(!"QUIT".equals(ois.readLine())){
            String tmp = ois.readLine();
            System.out.println(tmp);
        }
    }
}

 

这里要注意输入输出流提供了两种读取方法readByte()readLine(),区分它们的逻辑关系,一个是按一个一个字符读(回车也是一个字符!),一个是按行读。

对象流规律总结如下:

 

构造器参数

方法参数

特殊方法

 

数据源(File)

目的地(byte[])

 

FileInputStream

File中读

读入此byte[]

 

ByteArrayInputStream

byte[]中读

 

ObjectInputStream

InputStream

任意流

readObject()最外层,不被包装。

BufferedInputStream

InputStream

任意流

 

DataInputStream

InputStream

任意流

 

 

That‘s all.欢迎各位的宝贵意见。

Java序列化与对象流浅谈