首页 > 编程语言 >13.3 Java对象序列化梳理

13.3 Java对象序列化梳理

时间:2024-08-27 17:21:29浏览次数:10  
标签:ObjectOutputStream ObjectInputStream 对象 接口 Java 序列化 13.3

目录

13.3 Java对象序列化

13.3.1  引入

13.3.1  对象序列化与对象流

1.Serializable接口

2.ObjectInputStream类和ObjectOutputStream类

13.3.2 向ObjectOutputStream中写入对象


13.3 Java对象序列化

13.3.1  引入

应用场景:对象的寿命通常随着创建该对象程序的终止而终止。有时可能需要将对象的状态保存下来,在需要时再将其恢复对象状态的保存和恢复可以通过对象I/O流实现。

定义:集合是指集中存放一组对象的一个对象,可以将集合看作是能够操作这些元素的容器,包括了保存、获取和操作其他元素的方法。

13.3.1  对象序列化与对象流

1.Serializable接口

将程序中的对象输出到外部设备(磁盘、网络)中,成为对象序列化(serialization)。反之,从外部设备将对象读入到程序中称为反序列化(deserialization)。一个类的对象要实现对象序列化,必须实现java.io.Serializable接口,该接口的定义如下:
public interface Serializable{}
注意:Serializable接口只是标识性接口,其中没有定义任何方法一个类的对象要序列化,除了必须实现Seriablizable接口外,还需要创建对象输入流和对象输出流,然后通过对象输出流将对象状态保存下来,通过对象输入流恢复对象的状态。

2.ObjectInputStream类和ObjectOutputStream类

在java.io包中定义了ObjectInputStream和ObjectOutputStream两个类,分别称为对象输入流和对象输出流。
ObjectInputStream类继承了InputStream,实现了ObjectInput接口,而ObjectInput接口又继承了DataInput接口。
ObjectOutputStream类继承了OutputStream类,实现了ObjectOutput接口,而ObjectOutput接口又继承了DataOutput接口(如图13-1所示)

图13-1 ObjectInputStream类和ObjectOutputStream类

13.3.2 向ObjectOutputStream中写入对象

若将对象写到外部设备需要建立ObjectOutputStream类的对象,构造方法为:


public ObjectOutputStream(OutputStream out)


参数out为一个字节流输出对象。创建了对象输出流后,就可以调用它的writeObject()方法将一个对象写入流中,该方法格式为:


public final void writeObject(Object obj) throws IOException


若写入的对象不是可序列化的,该方法会抛出NoSerializableException异常,由于ObjectOutputStream类实现了DataOutput接口,该接口定义多个方法用来写入基本数据类型,如writeInt().writeFloat()及writeDouble()等,可以使用这些方法向对象输出流中写入基本数据类型
下面代码将一些数据写到对象输出流中

FileOutputStream fos=new FileOutputStream("data.ser");
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeInt(2010);
oos.writeObject("你好");
oos.writeObject(LocalDate.now());

ObjectOutputStream必须建立在另一个字节流上,上述例子是建立在FileOutputStream上的,向文件写入一个整数、字符串“你好”和一个LocalDate对象

13.3.3  从ObjectInputStream中读出对象

若要从外部设备上读取对象,需建立ObjectInputStream对象,该类的构造方法为:

public ObjectInputStream(InputStream in)

参数in为字节输入流对象。通过调用ObjectInputStream类的方法readObject()可以将一个对象读出,该方法的声明格式如下

public final Object readObject() throws IOException

在使用readObject()方法读出对象时,其类型和顺序必须与写入时一致。由于该方法返回Object类型,因此在读出对象时需要适当的类型转换

ObjectInputStream类实现了DataInput接口,该接口定义了读取基本数据类型的方法,如readInt()、readFloat()及readDouble(),使用这些方法可以从ObjectInputStream流中读取基本数据类型

下面代码在InputStream对象上创建一个对象输入流对象

FileInputStream fis=new FileInputStream("data.ser");
ObjectInputStream ois =new ObjectInputStream(fis);
int i=ois.readInt();
String today=(String)ois.readObject();
LocalDate date= (LocalDate) ois.readObject();

与ObjectOutputStream一样,ObjectInputStream也必须建立在另一个流上,本例中就是建立在FileInputStream上的。接下来使用readInt()和readObject()方法读出整数、字符串和LocalDate对象

注意事项:

1.序列化只能保存对象的非static成员,不能保存任何成员方法和static成员变量,而且序列化保存的只是变量的值
2.用transient关键字修饰的变量为临时变量,也不能被序列化
3.对于成员变量为引用类型时,引用的对象也被序列化

13.3.4  序列化数组

如果数组中的所有元素都是可序列化的,这个数组就是可序列化的。一个完整的数组可以用writeObject()方法存入文件,之后用readObject()方法读取到程序中

标签:ObjectOutputStream,ObjectInputStream,对象,接口,Java,序列化,13.3
From: https://blog.csdn.net/haozihua/article/details/141543367

相关文章

  • 关于java中Stream理解
    关于java中Stream理解Stream是什么Stream:Java8新增的接口,Stream可以认为是一个高级版本的Iterator。它代表着数据流,流中的数据元素的数量可以是有限的,也可以是无限的。Stream跟Iterator的差别是无存储:流是基于数据源的对象,它本身不存储数据元素,而是通过管道将数据源的元素......
  • JavaScript 对象构造器
    <!DOCTYPEhtml><htmllang="en"><body><pid="demo"></p><script>functionPerson(first,last,age,like){this.firstName=first;this.lastName=last;......
  • Java AOT思想
    AOT(Ahead-Of-Time)编译是一种编译技术,它可以在程序运行之前将源代码或字节码编译成机器代码,从而提高程序的启动速度和整体性能。在Java中,AOT机制能够有效地优化Java应用的启动时间,尤其是在需要快速响应的场景中,如微服务、容器化应用等。AOT编译的工作原理在传统的JVM(JavaVirt......
  • JAVA学习之集合
    1.集合的概念    将若干用途、性质相同或相近的“数据”组合而成的一个整体。    Java集合只能保存引用类型的数据,不能保存基本类型数据。Java常用集合:Set(集):集合中的对象不按特定方式排序,并且没有重复对象。List(列表):集合中的对象按照索引位置排序,可以有重......
  • java实现线性反馈移位寄存器实例
    题目:3级线性反馈移位寄存器C3=1时可有4种线性反馈函数,设其初始状态为(a1,a2,a3)=(1,0,1),输出由它们得到的密钥流,并分别利用生成的密钥流对明文“0x0123456789ABCDEF”进行加密,输出加密后的结果,再对密文进行解密,输出解密后的结果。1.分析相关题目详解:3级线性反馈移位寄存器......
  • (javaweb)事务管理+AOP
    目录1.spring事务管理2.rollbackFor(异常回滚属性)3.propagation(事物传播行为)AOP基础1.AOP概述AOP快速入门AOP核心概念APO进阶1.通知类型2.通知顺序3.切入点表达式 4.连接点5.AOP案例1.spring事务管理spring的第二大核心:AOP(面向切面编程)IOC是第一大核心:控制......
  • 【java计算机毕设】网上商城MySQL springcloud vue HTML maven项目设计源码带项目报告
    目录1项目功能2项目介绍3项目地址 1项目功能【java计算机毕设】网上商城MySQLspringcloudvueHTMLmaven项目设计源码带项目报告PPT前后端可分离也可不分离 2项目介绍系统功能:网上商城包括管理员、用户两种角色。管理员功能包括个人中心模块用于修改个人......
  • JavaScript简介
    一、JavaScript简介1.什么是JavaScript?JavaScript简称为JS,由网景公司开发的客户端脚本语言,不需要编译,可以直接运行Web前端三层:结构层 HTML 定义页面的结构样式层 CSS 定义页面的样式行为层 JavaScript 用来实现交互,提升用户体验2.JavaScript作用在客户端动......
  • 【JUC并发编程系列】深入理解Java并发机制:CAS算法与原子类在Java中的实践应用(二、CAS
    文章目录【JUC并发编程系列】深入理解Java并发机制:CAS算法与原子类在Java中的实践应用(二、CAS)1.同步之原子类(Atomic类)2.使用atomicInteger计数3.使用atomicInteger底层原理3.compareAndSet原理分析3.1手写AtomicInteger3.2手写Lock锁3.3CASaba的问题3.4Atomic......
  • 【JUC并发编程系列】深入理解Java并发机制:从用户态到内核态的探索(一、前置知识)
    文章目录【JUC并发编程系列】深入理解Java并发机制:从用户态到内核态的探索(一、前置知识)1.用户态与内核态区别2.线程安全同步的方式3.传统锁有哪些缺点4.发生CPU上下文切换的原因5.如何避免上下文切换6.详细总结6.1用户态与内核态6.2线程安全同步方式6.3传统锁的......