【Java】Input,Output,Stream I/O流 04 对象流&序列化
对象流,序列化机制
ObjectInputStream
ObjectOutputStream
序列化 对象 写入转 数据 持久化
反序列化 数据 读取转 对象 活化
- 任何实现了Serializable接口的类,其对象可以转化为字节数据,保存和传输时可以还原
- 序列化是RMI [ Remote Method Invoke] 远程方法调用过程的参数和返回值都必须实现的机制
RMI就是JavaEE的基础,所以序列化也是JavaEE的基础
- 实现序列化可以选择两种接口 Serializable Externalizable
持久化与活化
如果持久化多个对象或者属性,那么读取时也需要按照同样的顺序读取
public class SerializableTest {
public static void main(String[] args) throws Exception {
//persistence();
activation();
}
// 对象持久化
static void persistence() throws Exception {
// 创建对象流
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("ObjectStore.txt")));
// 写入对象
objectOutputStream.writeObject(new Person("杰哥",24,true,new String[]{"锐普阿伟","狂笑","尾行"}));
// 刷新
objectOutputStream.flush();
// 释放
objectOutputStream.close();
}
// 对象活化
static void activation() throws Exception {
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("ObjectStore.txt")));
Object object = objectInputStream.readObject();
if (object instanceof Person) {
Person person = (Person) object;
System.out.println(person);
}
objectInputStream.close();
}
}
// 对象要实现可序列化接口
class Person implements Serializable {
String name;
Integer age;
Boolean gender;
String[] hobby;
public Person(String name, Integer age, Boolean gender, String[] hobby) {
this.name = name;
this.age = age;
this.gender = gender;
this.hobby = hobby;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Boolean getGender() {
return gender;
}
public void setGender(Boolean gender) {
this.gender = gender;
}
public String[] getHobby() {
return hobby;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
", hobby=" + Arrays.toString(hobby) +
'}';
}
}
序列版本UID的意义是?
private static final long serialVersionUID = -6849794470754667710L;
假设在没有这个UID的情况下,序列化的类的对象成功持久化写入文件内
而这个对象的类字段或者其他成员发生了改变,再将对象活化时,这个对象无法被识别是出自这个类的对象
UID就是为了确保对象活化时能够正常的被识别出来,而设置的
此外 自定义类中的属性也必须保证是可序列化的(String和基本类型都已经是可序列化的了,要注意是组合自定义类的情况)
序列化无法写入static修饰的和transient修饰的成员变量,值在活化后都为null
序列化实现的总结:
- 1 自定义的类和类中的所有属性必须都是实现了序列化接口的!!![注意自定义的属性]
- 2 声明序列版本UID 确保类在变更字段之前持久化的对象,在活化之后能被Java正常识别
- 3 注意static 和 transient 都不能序列化
【Java】Input,Output,Stream I/O流 04 对象流&序列化的更多相关文章
- Java基础(八)——IO流3_对象流
一.对象流 1.序列化与反序列化 序列化:将内存中的Java对象保存到磁盘中或通过网络传输出去. 反序列化:将磁盘文件中的对象还原为内存中的一个Java对象. 用途: (1)将对象保存到物理硬盘:比如 ...
- Java IO7:管道流、对象流
前言 前面的文章主要讲了文件字符输入流FileWriter.文件字符输出流FileReader.文件字节输出流FileOutputStream.文件字节输入流FileInputStream,这些都是常 ...
- Java IO5:管道流、对象流
前言 前面的文章主要讲了文件字符输入流FileWriter.文件字符输出流FileReader.文件字节输出流FileOutputStream.文件字节输入流FileInputStream,这些都是常 ...
- java --对象流与对象的序列化
对象流 ObjectInputStream ObjectOutputStream类分别是InputStream和OutputStream的子类,对象输出流使用writeObject(Object ob ...
- Java IO流之对象流
对象流 1.1对象流简介 1.2对象流分类 输入流字节流处理流:ObjectInputStream,将序列化以后的字节存储到本地文件 输出流字节流处理流:ObjectOutputStream 1.3序 ...
- 【Java IO流】对象的序列化和反序列化
对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...
- Java之IO流进阶篇:内存流,打印流,对象流
Java中的IO流,即为输入输出流.所谓输入输出流,都是相对于程序而言,程序就是这个参照物.一张图看懂输入输出流: 输入流抽象基类:InputStream,Reader 输出流抽象基类:OutputS ...
- 6.5(java学习笔记)其他流(字节数组流,数据流,对象流,打印流)
一.字节数组流 之前使用输入输出流的操作的对象是文件,而这里字节数组流操作的对象是内存,内存可以看做是一个字节数组. 使用字节数组流读写就可以看做是从内存A到内存B的读写,对象时内存即字节数组. 1. ...
- Java文件与io——打印流和对象流
打印流的主要功能是用于输出,在整个IO包中打印流分为两种类型: 字节打印流:PrintStream 字符打印流:PrintWriter 打印流可以很方便的进行输出 public class Print ...
- io流(对象流总结)
对象流 对象流就是对引用数据类型进行操作 序列化:将对象的状态信息转换为可以存储或传输的形式的过程,因此类需要序列化后才可以存储到文件中 对象输出流: 很简单,就三句话,将把一个对象导入指定文件中,要 ...
随机推荐
- 鸿蒙HarmonyOS实战-ArkTS语言基础类库(并发)
一.并发 并发是指在一个时间段内,多个事件.任务或操作同时进行或者交替进行的方式.在计算机科学中,特指多个任务或程序同时执行的能力.并发可以提升系统的吞吐量.响应速度和资源利用率,并能更好地处理多用户 ...
- 题目:SHMIP The subglacial hydrology model intercomparison Project
SHMIP(冰下水文模型比较计划)是一个致力于解决冰下水文多种理论方法问题的项目.该计划通过构建一系列综合模拟实验,并对运行这些模拟的各参与模型的结果进行比较,以达到其目标.这将有助于潜在的模型用户更 ...
- MESI--CPU缓存一致性协议
概念 MESI(Modified Exclusive Shared Or Invalid)(也称为伊利诺斯协议,是因为该协议由伊利诺斯州立大学提出)是一种广泛使用的支持写回策略的缓存一致性协议. ME ...
- admission-controllers
WebHook是什么 官方文档: https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/admission-controller ...
- 快速调用 GLM-4-9B-Chat 语言模型
一.确认本机显卡配置 二.下载大模型 国内可以从魔搭社区下载, 下载地址:https://modelscope.cn/models/ZhipuAI/glm-4-9b-chat/files 三.运行官方 ...
- 面试题:Linux 系统基础提问 (一)
Linux系统中如何管理用户和组? Linux系统中用户和组的管理通常包括以下几个方面: 1.创建用户和组: 使用useradd和groupadd命令创建新用户和新组. 2.修改用户和组信息: 使用u ...
- PaddleNLP UIE -- 药品说明书信息抽取(名称、规格、用法、用量)
目录 创建项目 环境配置 上传代码 训练定制 代码结构 数据标注 准备语料库 数据标注 导出数据 数据转换 doccano Label Studio 模型微调 模型评估 定制模型--预测 效果 Pad ...
- The Beauty of Physics
绪言/1 学物理的人用不着对物理方程的意义操心,只要关心物理方程的美就够了. --狄拉克 此曲只应天上有--开普勒的和谐宇宙/11 天体的运动只不过是某种永恒的复调音乐而已,要用才智而不是耳朵来倾听. ...
- 你使用过 Vuex 吗?
Vuex 是一个专为 Vue.js 应用程序开发的状态(全局数据)管理模式.每一个 Vuex 应用的核心就是 store(仓库)."store" 基本上就是一个容器,它包含着你的应 ...
- Mac部署Tomcat8.5
官网下载 点我直达 启动 将Tomcat包解压后并放到这个目录下:/Users/chenyanbin/plus/tomcat8.5/bin 切换目录: cd /Users/chenyanbin/plu ...