Java开发——31.I/O流_处理流(对象流),对象的序列化机制

简介: 对象的序列化机制:允许把内存中的Java对象转换成和平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点(序列化);其它程序获取了这种二进制流,就可以恢复成原来的Java对象(反序列化)。

I/O流:主要操作文件内容,结合前面所学的File类,我们可以读取和写出文件,也可以修改文件的字符集编码...


处理流:

处理流就相当于外衣,每件衣服的作用不同,每个处理流的作用也不同,处理流可以实现多嵌套,即可以有多个处理流,每个处理流的功能不同!


前面已经学习过了5个处理流了,现在你对I/O的操作是不是已经烂熟于心了,今天我们将要学习的对象流,重点学习对象的序列化机制!!!


学习大纲:

image.png



对象流:

对象流和数据流类似,唯一的不同是对象流能读取/写出对象,对象流能对基本数据类型+String类型数据进行读取/写出的操作,能对保存的数据进行持久化保存到文件的操作;

对象流的强大之处,就是能把Java中的对象写入到数据源中,也能把对象从数据源中还原回来!!!


序列化:将Java对象添加到数据源中;

   标准:用ObjectOutputStream保存基本数据类型或者对象的机制;

反序列化:将Java对象从数据源中还原回来。

   标准:用ObjectInputStream读取基本数据类型或者对象的机制。

我们这里可以通俗的把数据源理解成一个哆啦A梦的转换机,可以实现大熊在任意时空中的穿梭,并保证了大熊的完整性,不会因为过程而发生变形/损失;

Java层面的理解就是:数据在序列化和反序列化的过程中,保证唯一对应,并不会因为序列化的问题而在反序列化的过程中丢失。


对象的序列化机制:

允许把内存中的Java对象转换成和平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点(序列化);其它程序获取了这种二进制流,就可以恢复成原来的Java对象(反序列化)。


序列化的好处:

可以将传入的任何实现了Serializable接口的对象转换为字节数据,使其在保存和还原的过程中可被还原!!!


序列化就是JavaEE平台的基础;RMI(Remote Method Invoke – 远程方法调用)过程的参数和返回值都必须实现的机制。



序列化图解过程:

image.png


展开说明:


interfaceSerializable它里面是没有方法或者参数的,就相当于一个序列化机制的标识publicstaticfinallongserialVersionUID=xxxxxL;(自定义值)serialVersionUID用来表明类的不同版本间的兼容性。简言之,其目的是以序列化对象进行版本控制,有关各版本反序列化时是否兼容。


注意事项:

  1. 序列化的对象必须实现Serializable接口;
  2. 序列化的对象必须定义全局常量serialVersionUID;
  3. 序列化的对象中的所有属性必须全部实现序列化...
    针对第三条,就是为了预防对象中,包含其他自定类对象,但自定义类并没有实现序列化机制(也就是没有满足第1、2条);
  4. 不能序列化static和transient修饰的变量!!!
    static所属于类,并不属于对象;
    transient相当于临时变量。
  5. 基本数据类型底层都已经实现了Serializable接口,和定义了全局常量serialVersionUID,所以我们在使用的时候不需要重新定义...

image.png


//对第三条的解释publicclassPersonimplementsSerializable {
publicstaticfinallongserialVersionUID=415539532L;
Stringname;
intage;
intid;
Smilesmile;
}
publicclassSmileimplementsSerializable{
publicstaticfinallongserialVersionUID=4155569532L;
booleanstart;
}


对象流案例:

自定义对象:


publicclassPersonimplementsSerializable {
publicstaticfinallongserialVersionUID=415539532L;
Stringname;
intage;
intid;
Smilesmile;
@OverridepublicStringtoString() {
return"Person{"+"name='"+name+'\''+", age="+age+", id="+id+", smile="+smile+'}';
    }
publicPerson(Stringname, intage, intid) {
this.name=name;
this.age=age;
this.id=id;
    }
publicPerson(Stringname, intage, intid, Smilesmile) {
this.name=name;
this.age=age;
this.id=id;
this.smile=smile;
    }
publicPerson() {
    }
publicPerson(Stringname, intage) {
this.name=name;
this.age=age;
    }
}


写入/读取对象:


/*** 练习*/publicstaticvoidobjectStreamTest(Stringpath){
ObjectOutputStreamoos=null;
ObjectInputStreamois=null;
try {
oos=newObjectOutputStream(newFileOutputStream(path));
ois=newObjectInputStream(newFileInputStream(path));
oos.writeObject(newPerson("小红",28));
oos.flush();
Personperson= (Person) ois.readObject();
System.out.println(person);
        } catch (IOExceptione) {
e.printStackTrace();
        } catch (ClassNotFoundExceptione) {
e.printStackTrace();
        } finally {
if (oos!=null) {
try {
oos.close();
                } catch (IOExceptione) {
e.printStackTrace();
                }
            }
if (ois!=null) {
try {
ois.close();
                } catch (IOExceptione) {
e.printStackTrace();
                }
            }
        }
    }
//Person{name='小红', age=28, id=0, smile=null}
相关文章
|
12月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
1237 157
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
存储 NoSQL Java
配置RedisTemplate序列化机制
通过上述步骤,你可以灵活配置RedisTemplate的序列化机制,根据应用需求选择合适的序列化器,从而确保数据在Redis中的存储和读取效率最优化。配置合适的序列化机制对于性能和存储效率至关重要,而且这样可以确保数据在存储和传输过程中的结构清晰和一致性。
668 11
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
缓存 安全 Java
Java反射机制:动态操作类与对象
Java反射机制是运行时动态操作类与对象的强大工具,支持获取类信息、动态创建实例、调用方法、访问字段等。它在框架开发、依赖注入、动态代理等方面有广泛应用,但也存在性能开销和安全风险。本文详解反射核心API、实战案例及性能优化策略,助你掌握Java动态编程精髓。
|
安全 Java 数据库
Java 项目实战病人挂号系统网站设计开发步骤及核心功能实现指南
本文介绍了基于Java的病人挂号系统网站的技术方案与应用实例,涵盖SSM与Spring Boot框架选型、数据库设计、功能模块划分及安全机制实现。系统支持患者在线注册、登录、挂号与预约,管理员可进行医院信息与排班管理。通过实际案例展示系统开发流程与核心代码实现,为Java Web医疗项目开发提供参考。
584 2
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
451 0
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
640 1
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
568 1

热门文章

最新文章