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全栈学习路线、学习资源和面试题一条龙

我心里优秀架构师是怎样的?

免费下载经典编程书籍

更多优质文章和资源

原创不易:分享,点赞

Java序列化流的奇妙之旅的更多相关文章

  1. Java序列化流-ObjectOutputStream、ObjectInputStream

    Java对象流的基本概念: 实例代码: 实体类User: import java.io.Serializable; /** * @author zsh * @company wlgzs * @crea ...

  2. Java序列化流

    1.什么是序列化流 序列化就是把Java对象“流化”,序列化后的Java对象可以保存到本地文件系统,或者通过Socket传输到其他的服务器. Java中对象序列化有以下特点: 1)类实现java.io ...

  3. java 序列化流与反序列化流

    一 对象序列化流ObjectOutputStream ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream.可以使用 ObjectInputStr ...

  4. Java序列化格式详解

    RPC的世界,由于涉及到进程间网络远程通信,不可避免的需要将信息序列化后在网络间传送,序列化有两大流派: 文本和二进制. 文本序列化 序列化的实现有很多方式,在异构系统中最常用的就是定义成人类可读的文 ...

  5. Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)

    1.操作基本数据类型的流     1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出 ...

  6. Java基础知识强化之IO流笔记65:序列化流 和 反序列化流

    1. 什么是 序列化 和 反序列化 ?     序列化 (Serialization):将对象的状态信息转换为可以存储或传输的形式的过程.比如转化为二进制.xml.json等的过程. 在序列化期间,对 ...

  7. java中的序列化流和反序列化流

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px SimSun; color: #4e9072 } 序列化流:把对象按照流一样的方式存入文本文件 ...

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

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

  9. Java学习笔记32(IO:序列化流)

    对象中的数据 ,以流的形式,写入到文件中保存,过程称为写出对象,对象的序列化 ObjectOutputStream将对象写到序列中,实现序列化 在文件中,以流 的形式,将对象读取出来,过程称为读取对象 ...

随机推荐

  1. 免密码提交gitlab

    在你的用户目录下新建一个文本文件.git-credentials echo 'https://henry:123456@ggithub.com' > /root/.git-credentials ...

  2. MySQL8.0.28安装教程全程参考MySQL官方文档

    前言 为了MySQL8.0.28安装教程我竟然在MySQL官方文档逛了一天,至此献给想入门MySQL8.0的初学者.以目前最新版本的MySQL8.0.28为示例进行安装与初步使用的详细讲解,面向初学者 ...

  3. 火爆的文字游戏你玩了吗?「GitHub 热点速览 v.22.06」

    不知道你有没有被 Wordle 这款游戏刷屏,在本期热点速览的特推部分选了一个 React 编写的开源版本同你分享,而本次公众号摘要也是一个提示, 只不过这个只能盲猜了.别小瞧 Wordle 这个游戏 ...

  4. Nacos服务注册与发现的2种实现方法!

    Spring Cloud Alibaba 技术体系中的 Nacos,提供了两个重要的功能:注册中心(服务注册与发现)功能和配置中心功能. 其中注册中心解决了微服务调用中,服务提供者和服务调用者的解耦, ...

  5. k8s实战之部署Prometheus+Grafana可视化监控告警平台

    写在前面 之前部署web网站的时候,架构图中有一环节是监控部分,并且搭建一套有效的监控平台对于运维来说非常之重要,只有这样才能更有效率的保证我们的服务器和服务的稳定运行,常见的开源监控软件有好几种,如 ...

  6. Java产生指定范围内的随机日期

    要想产生指定范围内的随机日期,首先我们要指定一个范围,那么我们可以通过SImpleDateFormat格式化日期,然后再通过parse()方法设置日期,返回一个Date类型的日期对象,再转化为时间戳( ...

  7. Git重命名远程分支

    一.重命名本地分支 将hot_fix分支重命名为bug_fix git branch -m hot_fix bug_fix 二.推送重命名后的本地分支到远程仓库 git push origin bug ...

  8. https校验问题

    一般会报SSL问题:解决办法参考 http://blog.csdn.net/a506681571/article/details/78284589 # 设置未经允许验证的SSL方法,只需运行一次便可 ...

  9. Oracle用户创建、删除和授权等方法总结

    一.查看用户及权限 1.查询所有用户: 1.1.查看所有用户基本信息 select * from all_users; 1.2.查看所有用户相信信息 select * from dba_users; ...

  10. kube-scheduler源码分析(1)-初始化与启动分析

    kube-scheduler源码分析(1)-初始化与启动分析 kube-scheduler简介 kube-scheduler组件是kubernetes中的核心组件之一,主要负责pod资源对象的调度工作 ...