当前位置: 首页 > news >正文

Java之序列化与反序列化

       Java序列化与反序列化是什么?干什么用的等等这些问题真的困扰了我很久了,总是不理解为什么要序列化,又为什么要反序列化?在什么情况下会用到Java的序列化和反序列化呢?直到今天学习了MapReduce,才深刻的理解了Java序列化和反序列话的作用及什么情况下使用。

Java序列化与反序列化是干什么的?
       如果一个对象被序列化之后保存在文件中,可以通过反序列化将对象的类型信息,对象的数据及对象中的数据类型在内存中从新新建。通俗点理解就是,一个对象在一台机器上被序列化保存在文件中,可以在另外一台机器上通过反序列化从新新建这个对象。

使用序列化和反序列化的好处?
  1. 实现了数据的持久化,通过序列化将数据永久的保存在文件中或数据库中。
  2. 利用序列化实现远程通信,即在网络上传送对象的字节序列。简单点说,就是发送方把需要发送的对象转换为字节序列,然后在网络上传输。接收方需要从字节序列中恢复出Java对象。
如何实现Java序列化与反序列化呢?
  • java.io.ObjectOutputStream:表示对象输出流
          它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
  • java.io.ObjectInputStream:表示对象输入流
          它的readObject()方法源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回。

实现序列化的要求?
       只有实现了Serializable了接口的类的对象才能被序列化,否则抛出NotSerializableException异常。
案例:
  • User类:
public class User implements Serializable {
    private String username;
    private int age;

    public User() {
    }
    public User(String username, int age) {
        this.username = username;
        this.age = age;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", age=" + age +
                '}';
    }
}

  • 将序列化的对象保存在文件中
    @Test
    public void out(){
        User user = new User("张三",18);
        File file = new File("d://out.txt");
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
            objectOutputStream.writeObject(user);
            objectOutputStream.flush();
            objectOutputStream.close();
            fileOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


结果:
                       
  • 通过反序列化从新生成对象
    @Test
    public void input(){
        File file = new File("d://out.txt");

        try {
            FileInputStream inputStream = new FileInputStream(file);
            ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
            User user = (User) objectInputStream.readObject();
            System.out.println(user);

            objectInputStream.close();
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


结果:
                 

总结:
  • Java序列化就是把对象转换成字节序列,而Java反序列化就是把字节序列还原成Java对象。
  • 采用Java序列化与反序列化技术,一是可以实现数据的持久化,在MVC模式中很是有用;二是可以对象数据的远程通信。
  • 继续巩固基础。↖(^ω^)↗!!!

相关文章:

  • Hadoop之常用shell命令整理
  • Itext笔记之pdf页眉页脚
  • JAVA操作HDFS案例
  • zookeeper-3.4.10安装教程---分布式配置
  • storm-1.1.0安装教程---分布式配置
  • Hadoop之HDFS分布式文件系统读写流程详解
  • Zookeeper之常用API详解
  • Docker之Docker介绍及安装配置
  • Docker之Docker镜像管理
  • Docker之Centos7 Docker私有仓库搭建
  • GitLab之创建项目组及项目
  • Docker安装Jenkins
  • Linux之文件及目录常用操作
  • Linux常用压缩和解压缩命令
  • 软件工程之概述
  • php的引用
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 2019.2.20 c++ 知识梳理
  • ComponentOne 2017 V2版本正式发布
  • Consul Config 使用Git做版本控制的实现
  • dva中组件的懒加载
  • exif信息对照
  • flutter的key在widget list的作用以及必要性
  • HTTP--网络协议分层,http历史(二)
  • Java|序列化异常StreamCorruptedException的解决方法
  • PV统计优化设计
  • SQLServer之索引简介
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 编写符合Python风格的对象
  • 复杂数据处理
  • 老板让我十分钟上手nx-admin
  • 聊聊flink的TableFactory
  • 微服务框架lagom
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #{}和${}的区别是什么 -- java面试
  • #数学建模# 线性规划问题的Matlab求解
  • (2)nginx 安装、启停
  • (C)一些题4
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (转)socket Aio demo
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .net mvc 获取url中controller和action
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .NET成年了,然后呢?
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • @EnableConfigurationProperties注解使用
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [ 蓝桥杯Web真题 ]-布局切换