Java序列化流的奇妙之旅
Java序列化流有何奇妙之处呢?通过一个个案例逐一感受序列化流。
!!!好戏在后头!!!
1.IO流读写文件
先从一个普通文件读写字符串开始讲起。
例子:输出字符串到文件,再从文件中读取字符串

在某一天灵感迸发:我可以把Java程序中的对象信息直接保存到普通的 txt 文件中吗?并且当我想使用它时,还可以拿出来就可以直接用,不需要再做其他处理,就像存储普通的字符串一样,在文件中读出来就可以直接使用的那种。
2.序列化和反序列化流奇妙之处
要想实现对象信息存储到普通文件不被破化,并且读取出来不需要再做其他处理既可以像使用普通new出来的对象一样直接使用的效果,必须有一种特殊的IO流来完成,于是诞生了序列化流和反序列化流。
2.1.案例一:把普通文件当作对象存储库来使用
详细的描述:将一个list 集合保存到普通文件,再读出来直接使用,实现list集合数据的增删改查
Person 类
// 序列化对象信息:必须实现序列化标记接口Serializable
public class Person implements Serializable {
// 序列化版本UID
private static final long serialVersionUID = 1L;
private String name;
private int age;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Person{" + "name='" + name + ", age=" + age + ", sex='" + sex + '}';
}
public Person() {
}
public Person(String name, Integer age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
}
序列化和反序列化
public class Demo2 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//数据准备:集合类都实现了序列化接口Serializable
List<Person> list = new ArrayList<>();
list.add(new Person("张三",38,"男"));
list.add(new Person("李四",38,"男"));
list.add(new Person("如花",18,"女"));
// 序列化保存到普通文件
File file = new File("D:/demo2.txt");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
objectOutputStream.writeObject(list);
objectOutputStream.close();
// 读取普通文件反序列化
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));
List<Person> personList = (List<Person>) objectInputStream.readObject();
objectInputStream.close();
for (Person person:personList){
System.out.println(person);
}
}
}
执行结果:

序列化保存到普通文件的数据:

虽然没人会考虑使用这种方式来保存数据,但这对于理解序列化流有很大的帮助。
2.2.案例二:任意元素类型的List 集合序列化读写
**
* 任意元素类型的List 集合的对象存储到普通文件,读取直接使用
* @param <T>
*/
public class ObjectList<T extends List> {
// 序列化保存到普通文件
private File file = new File("D:/demoList.txt");
public void writerList(T t) throws IOException {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
objectOutputStream.writeObject(t);
objectOutputStream.close();
}
public T readList() throws IOException, ClassNotFoundException {
// 读取普通文件反序列化
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file));
T t = (T) objectInputStream.readObject();
objectInputStream.close();
return t;
}
public boolean isExists(){
return file.exists();
}
public boolean delete(){
return file.delete();
}
// 测试
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectList<List<Person>> objectList = new ObjectList<>();
//数据准备:集合类都实现了序列化接口Serializable
List<Person> list = new ArrayList<>();
list.add(new Person("张三",38,"男"));
list.add(new Person("李四",38,"男"));
list.add(new Person("如花",18,"女"));
// 持久化对象数据
objectList.writerList(list);
// 查询持久化对象数据
List<Person> personList = objectList.readList();
System.out.println("遍历持久化对象数据>");
for (Person person:personList){
System.out.println(person);
if (person.getAge()==38){// 修改年龄38的都改为18
person.setAge(18);
}
}
// 修改后持久化对象数据
objectList.writerList(personList);
System.out.println("遍历修改持久化对象数据>");
List<Person> personList1 = objectList.readList();
for (Person person:personList1){
System.out.println(person);
}
// 删除对象存储的持久化文件
if (objectList.isExists()){
System.out.println("删除对象存储的持久化文件");
objectList.delete();
}
}
}
序列化的目的
序列化流目的:把对象模型数据按序列化规则进行转化,转化后的数据可以保存到磁盘文本或通过网络传输; 反序列化流目的:把磁盘文件或网络传输的序列化数据按反序列化规则进行转化,恢复成对象模型数据,在程序中可直接操作对象模型数据。
前面的案例都是程序和磁盘的IO操作,接下来的是序列化对象通过网络传输的案例。
2.3.案例三:自己实现Java RMI(远程方法调用)
Java RMI(Remote Method Invocation)Java 远程方法调用,是Java编程语言里的一种用于实现远程方法调用的应用程序编程接口。RMI的宗旨就是尽可能简化远程接口对象的使用。
相类似的远程过程调用RPC(Remote Procedure Call),指的是一个进程调用另一个进程(本地或远程主机的进程)的过程。Java 的 RMI 则在 RPC 的基础上向前又迈进了一步,既提供了分布式对象间的通讯。但Java RMI仅限于Java语言间相互调用,无法实现不同语言间的远程方法调用。
在这感受下怎么实现远程方法调用,好玩时刻来了。
!!!高能预警!!!
篇幅原因,请移步到:自己写了个Java RMI(远程方法调用) 的实现案例


更多优质文章和资源

原创不易:分享,点赞
Java序列化流的奇妙之旅的更多相关文章
- Java序列化流-ObjectOutputStream、ObjectInputStream
Java对象流的基本概念: 实例代码: 实体类User: import java.io.Serializable; /** * @author zsh * @company wlgzs * @crea ...
- Java序列化流
1.什么是序列化流 序列化就是把Java对象“流化”,序列化后的Java对象可以保存到本地文件系统,或者通过Socket传输到其他的服务器. Java中对象序列化有以下特点: 1)类实现java.io ...
- java 序列化流与反序列化流
一 对象序列化流ObjectOutputStream ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream.可以使用 ObjectInputStr ...
- Java序列化格式详解
RPC的世界,由于涉及到进程间网络远程通信,不可避免的需要将信息序列化后在网络间传送,序列化有两大流派: 文本和二进制. 文本序列化 序列化的实现有很多方式,在异构系统中最常用的就是定义成人类可读的文 ...
- Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)
1.操作基本数据类型的流 1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出 ...
- Java基础知识强化之IO流笔记65:序列化流 和 反序列化流
1. 什么是 序列化 和 反序列化 ? 序列化 (Serialization):将对象的状态信息转换为可以存储或传输的形式的过程.比如转化为二进制.xml.json等的过程. 在序列化期间,对 ...
- java中的序列化流和反序列化流
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px SimSun; color: #4e9072 } 序列化流:把对象按照流一样的方式存入文本文件 ...
- 【Java IO流】对象的序列化和反序列化
对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...
- Java学习笔记32(IO:序列化流)
对象中的数据 ,以流的形式,写入到文件中保存,过程称为写出对象,对象的序列化 ObjectOutputStream将对象写到序列中,实现序列化 在文件中,以流 的形式,将对象读取出来,过程称为读取对象 ...
随机推荐
- Properties打印流
简介 java.util.Properties 继承于 Hashtable ,来表示一个持久的属性集.它使用键值结构存储数据,每个键及其对应值都是一个字符串.该类也被许多Java类使用,比如获取系统属 ...
- VC 为程序创建唯一标识
转载请注明来源:https://www.cnblogs.com/hookjc/ 应用: 一台机器上只许运行一个客户端 同一个账号只允许登陆一个客户端 BOOl m_IsRun=false; HANDL ...
- onclick="func()"和 onclick = "return func()"区别
onclick="func()" 表示只会执行 func , 但是不会传回 func 中之回传值onclick = "return func()" 则是 执行 ...
- html页面动效
找到了一个喜欢的黑客帝国动效"https://files.cnblogs.com/files/blogs/718959/codeMatrix-master.zip?t=1643081202& ...
- SQL server 查询当前数据库所有表的行数
SELECT OBJECT_NAME(ii.id) TableName ,rows FROM sysindexes ii INNER JOIN sysobjects oo ON ( oo.id = i ...
- Windows office2019免费激活,附代码
office2019地址:链接:https://pan.baidu.com/s/1zPt5U7b0L-bGHl5AOtYs2w提取码:m5ei 新建一个txt,然后把这段代码放进去,然后保存关闭改后缀 ...
- 精简的言语讲述技术人,必须掌握基础性IT知识技能,第一篇
前言 此系列将以精简的言语讲述技术人,必须掌握基础性IT知识技能,请持续关注,希望给大家都是一些精简的干货. 第一部分:必须掌握的设计模式的6大基本原则 23个设计模式,都是从这六大设计模式中演化而来 ...
- like使用索引如何避免失效
1 准备数据 1.1 建表 DROP TABLE IF EXISTS staff; CREATE TABLE IF NOT EXISTS staff ( id INT PRIMARY KEY auto ...
- Dubbo扩展点应用之三异步调用
Dubbo不只提供了堵塞式的同步调用,同时提供了异步调用的方式.这种方式主要应用于提供者接口响应耗时明显,消费者端可以利用调用接口的时间去做一些其他的接口调用,利用Future模式来异步等待和获取结果 ...
- JMM之Java线程间通讯——等待通知机制及其经典范式
在并发编程中,实际处理涉及两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体). 通信是指线程之间以何种机制来交换信息.在共享内存的并发模型里,线程之间共享程序的公共状 ...