对象流,序列化机制

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 对象流&序列化的更多相关文章

  1. Java基础(八)——IO流3_对象流

    一.对象流 1.序列化与反序列化 序列化:将内存中的Java对象保存到磁盘中或通过网络传输出去. 反序列化:将磁盘文件中的对象还原为内存中的一个Java对象. 用途: (1)将对象保存到物理硬盘:比如 ...

  2. Java IO7:管道流、对象流

    前言 前面的文章主要讲了文件字符输入流FileWriter.文件字符输出流FileReader.文件字节输出流FileOutputStream.文件字节输入流FileInputStream,这些都是常 ...

  3. Java IO5:管道流、对象流

    前言 前面的文章主要讲了文件字符输入流FileWriter.文件字符输出流FileReader.文件字节输出流FileOutputStream.文件字节输入流FileInputStream,这些都是常 ...

  4. java --对象流与对象的序列化

    对象流 ObjectInputStream ObjectOutputStream类分别是InputStream和OutputStream的子类,对象输出流使用writeObject(Object ob ...

  5. Java IO流之对象流

    对象流 1.1对象流简介 1.2对象流分类 输入流字节流处理流:ObjectInputStream,将序列化以后的字节存储到本地文件 输出流字节流处理流:ObjectOutputStream 1.3序 ...

  6. 【Java IO流】对象的序列化和反序列化

    对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...

  7. Java之IO流进阶篇:内存流,打印流,对象流

    Java中的IO流,即为输入输出流.所谓输入输出流,都是相对于程序而言,程序就是这个参照物.一张图看懂输入输出流: 输入流抽象基类:InputStream,Reader 输出流抽象基类:OutputS ...

  8. 6.5(java学习笔记)其他流(字节数组流,数据流,对象流,打印流)

    一.字节数组流 之前使用输入输出流的操作的对象是文件,而这里字节数组流操作的对象是内存,内存可以看做是一个字节数组. 使用字节数组流读写就可以看做是从内存A到内存B的读写,对象时内存即字节数组. 1. ...

  9. Java文件与io——打印流和对象流

    打印流的主要功能是用于输出,在整个IO包中打印流分为两种类型: 字节打印流:PrintStream 字符打印流:PrintWriter 打印流可以很方便的进行输出 public class Print ...

  10. io流(对象流总结)

    对象流 对象流就是对引用数据类型进行操作 序列化:将对象的状态信息转换为可以存储或传输的形式的过程,因此类需要序列化后才可以存储到文件中 对象输出流: 很简单,就三句话,将把一个对象导入指定文件中,要 ...

随机推荐

  1. k8s介绍

    k8s容器编排系统 k8S是谷歌几十年来研发的一套系统,更新了运维领域的玩法. 内容很多,先快速练习玩法,知道是什么就行. 具体[为什么]再花时间慢慢学吧! 0.参考资料 1. k8s能干什么 htt ...

  2. .Net8 AddKeyedScoped键值key注册服务异常

    异常描述:This service descriptor is keyed. Your service provider may not support keyed services. 场景:.Net ...

  3. Unity 编辑器中获取选中的文件夹、文件路径

    编辑器中获取选中的文件夹.文件路径 using UnityEditor; using UnityEngine; using Object = UnityEngine.Object; public cl ...

  4. .NET 日志系统-3 结构化日志和集中日志服务

    .NET 日志系统-3 结构化日志和集中日志服务 系列文章 认识.NET 日志系统 https://www.cnblogs.com/ZYPLJ/p/17663487.html .NET 认识日志系统- ...

  5. 生产环境部署Nginx服务器双机热备部署-keepalived(多种模式教程)

    前言:今天演示下生产环境keepalived的部署方式,安装模式有很多,比如说主备模型和双主模型,主备分:抢占模式 和 非抢占模式.这里我会一一展开说具体怎么配置 一.双节点均部署Nginx: 第一步 ...

  6. 中台框架模块开发实践-用 Admin.Core 代码生成器生成通用代码生成器的模块代码

    前言 之前分享中台 Admin.Core 的模块代码生成器,陆续也结合群友们的反馈,完善了一些功能和模板上的优化,而本篇将基于此代码生成器生成一个通用代码生成器模块的基本代码 后续再在此代码的基础上进 ...

  7. 【仿真】Carla简易安装 Window Ubuntu均适用 附ROS的简单连接 [0]

    参考与前言 CARLA Documentation 官方文档 后续链接:[仿真]Carla介绍与使用 [1] 本篇创建于 2020/12/18,安装方式为压缩包安装,无需UE4等软件,但是前提是需要一 ...

  8. ASP.NET Core修改CentOS的IP地址

    最近做的一个产品中有个需求,就是客户使用的时候可以通过Web网页修改服务器的IP地址(客户是普通使用者,没有Linux使用经验,我们的产品作为一台服务器部署到客户机房,客户通过HTTP方式访问使用). ...

  9. MySQL索引种类

    normal:表示普通索引 unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique full textl: 表示 全文搜索的索引. FULL ...

  10. 7.条件渲染if

    v-if v-if 指令用于条件性地渲染一块内容.这块内容只会在指令的表达式返回 truthy 值的时候被渲染. <h1 v-if="awesome">Vue is a ...