IO其他流--处理流保留数据+引用数据类型

本文介绍了Java中序列化和反序列化的概念及其应用。序列化是将对象的状态转化为二进制流以便存储或传输的过程,而反序列化则是相反的过程。文章通过一个示例程序展示了如何使用ObjectOutputStream和ObjectInputStream来实现这一过程。

序列化和反序列化

在前面已经说过,基本类型+String数据+类型的保留,这节有点类似,说的是引用数据的数据和类型的保留。它们有另外的名称序列化和反序列化。
——反序列化(将数据结构或对象转换成二进制串的过程,从文件或字节数组中取出对象) 输入流:ObjectInputStream readObject()
——序列化(将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程,把对象保存到文件或字节数组中) 输出流:ObjectOutputStream writeObject()
——注意:
————1)先序列化后反序列化;反序列化顺序必须与序列化一致
————2)不是所有对象都可以序列化,类必须实现java.io.Serializable;不是所有对象的属性都需要序列化,不需要的添加关键字transient

数据结构和对象:对于类似Java这种完全面向对象的语言,工程师所操作的一切都是对象(Object),来自于类的实例化。在Java语言中最接近数据结构的概念,就是POJO(Plain Old Java Object)或者Javabean--那些只有setter/getter方法的类。而在C++这种半面向对象的语言中,数据结构和struct对应,对象和class对应。

package cn.feng.others;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Arrays;

public class ObjectDemo01 {

    public static void main(String[] args) {
        try {
            seri("D:/安装包/aa/bb/dd/b.txt");
            read("D:/安装包/aa/bb/dd/b.txt");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 序列化
     * @throws IOException 
     * @throws FileNotFoundException 
     */
    public static void seri(String desPath) throws FileNotFoundException, IOException{
        Employee emp = new Employee("张三",100000);
        int[] arr = {1,2,3,4,5};
        //创建源
        File des = new File(desPath);
        //选择流ObjectOutputStream
        ObjectOutputStream oos = new ObjectOutputStream(
                    new BufferedOutputStream(new FileOutputStream(des))
                );
        //操作    写出的顺序与读取的顺序必须一致 为读取准备
        oos.writeObject(emp);
        oos.writeObject(arr);
        //释放资源
        oos.close();
    }

    /**
     * 反序列化
     * @throws IOException 
     * @throws FileNotFoundException 
     */
    public static void read(String srcPath) throws FileNotFoundException, IOException, ClassNotFoundException{
        //创建源
        File src = new File(srcPath);
        //选择流
        ObjectInputStream ois = new ObjectInputStream(
                    new BufferedInputStream(new FileInputStream(src))
                );
        //操作    读取的顺序与写出一致且必须存在才能读取
        //顺序不一致,数据存在问题
        Object obj = ois.readObject();
        if(obj instanceof Employee){
            Employee emp = (Employee)obj;
            System.out.println(emp.getName());//没有序列化的属性,内容:null
            System.out.println(emp.getSalary());//内容:100000.0
        }
        obj = ois.readObject();
        int[] arr = (int[])obj;
        System.out.println(Arrays.toString(arr));//内容:[1, 2, 3, 4, 5]
        //释放资源
        ois.close();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值