对象流,序列化机制

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. .NET8 Hello World!

    ​ 使用ASP.NET Core Web Application模板创建的Empty项目如下: ​ 这是一个最简单的Web项目,运行起来会在根路径响应Hello World! 2.1.1 Progra ...

  2. webpack 路径别名与导入后缀省略

    // 解析模块的规则 resolve: { // 配置解析模块路径别名:优点简写路径,缺点路径没有提示 alias: { // 定义一个@变量,可在import引入时使用 '@': path.reso ...

  3. 使用nginx 中转 https tls1.3 请求

    对方服务器使用的是TLS1.3,并关闭了一些算法套件,使得.NET FRAMEWORK 4.8 ..NET 5 都无法连接. 只能用中转方案解决. nginx配置: #user nobody; wor ...

  4. 玩爆你的手机联系人--T9搜索

        自己研究了好几天联系人的T9搜索算法, 先分享出来给大家看看. 欢迎指教.如果有大神有更好的T9搜索算法, 那更好啊,大家一起研究研究,谢谢. 第一部分是比较简单的获取手机联系人. 获取联系人 ...

  5. RequestBodyAdvice和注解方式进行统一参数处理demo

    RequestBodyAdvice和注解方式进行统一参数处理demo @Target({ ElementType.METHOD, ElementType.TYPE }) @Retention(Rete ...

  6. 【IEEE 出版】 第三届能源与电力系统国际学术会议 (ICEEPS 2024)

    [连续2届会后4-5个月EI检索,检索稳定!特邀院士.Fellow 报告!]第三届能源与电力系统国际学术会议 (ICEEPS 2024)以"创造更加柔性.智能的能源电力系统"为主题 ...

  7. MacOSX 运行Unity卡顿 [gethostname]

    用MacbookPro 32G i7 独显 的高配打开项目发现异常卡顿, Win平台没有问题 打开Unity的Profiler DeepProfiler. 发现完全是卡在 dns.gethostnam ...

  8. MAC10.12Caps Lock失灵

    先说一下小弟的MAC系统是黑苹果来的,笔记本并没有那个显示大小写的指示灯,所以一开始的时候一直以为自己的键盘坏了还特意换了一个(结果质量比原来的更差),输入密码因为有大小写经常被提示密码错误所以蛋疼得 ...

  9. /etc/shadow文件破解,密码破解,md5,SHA256,SHA512破解

    环境 Kali系统 John the Ripper密码破解者 shadow文件解析 文件的格式为: {用户名}:{加密后的口令密码}:{口令最后修改时间距原点(1970-1-1)的天数}:{口令最小修 ...

  10. Kubernetes(K8S)基本概念

    前言 有公司用 java 或 go , vue 或 react , linux 或 win ,但所有的大厂都在用k8s,没有或,而且是全世界.一个熟悉k8s的开发,薪资可以轻松上25的 base . ...