使用对象流读写对象信息

一、认识序列化

通俗点理解,序列化就是将对象的状态存储到特定存储介质中的过程,也就是将对象状态转换为可保持或传输格式的过程。在序列化过程中,会将对象的公有成员和私有成员包括类名转换为字节流。然后再把字节流写入数据,存储到存储介质中,这里说的存储介质通常指的是文件。
意义
使用序列化的意义在于将java对象序列化后,可以将其转换为字节序列这些字节序列可以保存在磁盘上,也可以借助网络进行传输,同时序列化后的对象保存的是二进制状态,这样实现了平台无关性,即可以将在windows操作系统中实现序列化的一个对象,传输到UNIX操作系统的机器上,再通过反序列化后得到相同对象,而无需担心数据因平台问题显示异常。

二、序列化保存对象信息

序列化机制允许将实现了序列化的java对象转换成字节序列,这个过程需要借助I/O流来实现。
在java中只有实现了java.io.Serializable接口的类的对象才能被序列化,因为Serializable表示可串行的,可序列化的,所以对象序列化又被称为串行化。

对象序列化的步骤:

1.创建一个对象输出流(ObjectOutputStream),他可以包装一个其他类型的输出流,如文件输出流(FileOutputStream)
2.通过对象输出流的writeObject()方法写对象,就是输出课序列化对象。

示例:使用序列化将对象保存到文件中
实现步骤:
1.引入相关类
2.创建学生类,实现Serializable接口
3.创建对象输出流
4.调用writeObject()方法将对象写入文件
5.关闭对象输出流

package date.test9;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class SerializableObj {
    public static void main(String[] args) throws IOException {
        //创建对象输出流
        ObjectOutputStream os = null;
        try {
            os = new ObjectOutputStream(new FileOutputStream("C:\\Users\\86177\\Desktop\\1.txt"));
            Test9 t = new Test9("喀什东路", "男", 32);
            //对象序列化,写入输出流
            os.writeObject(t);
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if (os!=null){
                os.close();
            }
        }
    }
}
~

拓展:
当需要保存多个学生对象时,可以使用集合保存对象,然后将集合中所有对象写入文件。
关键代码:

Student s1 = new Student("胡列娜",25,"女")
Student s2 = new Student("比比东",30,"女")
ArrayList<Student> list = new ArrayList<Student>()
list.add(s1)
list.add(s2)
//对象序列化,写入输出流
os.writeObject(list)

3.反序列化获取对象信息

既然能够将对象的状态保存到存储介质(如文件)中,那么如何将这些对象状态读取出来?显然,接下来讲的反序列化将是解决问题的关键。反序列化,顾名思义就是与序列化相反,反序列化是从特定存储介质中读取数据并重新构建成对象的过程。通过反序列化,可以将存储在文件上的对象信息读取出来,然后重新构建为对象。

1.反序列化的大概步骤

1.创建一个对象输入流ObjectInputStream,他可以包装一个其他类型的输入流
2.通过对象输入流的readObject方法读取对象,该方法返回一个Object对象
示例:使用反序列化读取上一个文件中的对象

package date.test9;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class ReadObjectDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {

    //创建对象输入流
    ObjectInputStream oss = null;
    try {
        oss = new ObjectInputStream
                (new FileInputStream("C:\\Pratice\\jdbc\\src\\doc\\1.txt"));
        //反序列化,进行强制类型转型
        Test9 t1 = (Test9) oss.readObject();
        //输出生成后的信息
        System.out.println("姓名为:" + t1.getName());
        System.out.println("性别为:" + t1.getSex());
        System.out.println("年龄为:" + t1.getAge());
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (oss != null) {
            try {
                oss.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
        }
        }

拓展:
同样的,如果是以集合的方式将两个学生对象写入到文件,则有以下办法
关键代码

//反序列化,进行强制类型转换
ArrayList<Test9> list  = (ArrayList<Test9>)oss.readObject();
//输出生成后的对象信息
for(Test9 t1:list){
	System.out.println("姓名为:" + t1.getName());
        System.out.println("性别为:" + t1.getSex());
        System.out.println("年龄为:" + t1.getAge());
 }
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值