0. 序列化的意义

从内存到本地即为本地化或者在网络中进行传输,或叫序列化,持久化。

某 Java 类实现 Serializable 接口的目的是为了可持久化(简单理解为本地化),比如网络传输或本地存储,为系统的分布式运行和异构部署提供先决支持条件。若没有序列化,我们熟悉的远程调用(RPC,无法读取远程主机内存中的任何目标,必须首选在远程将目标序列化),对象数据库都不可能存在。

1. 一个简单 demo

Serializable 为空接口,只是为了起到标识说明之义。

  • Person 类实现 Serializable 接口,这是一个简单的 JavaBean,实现了 Serializable 接口,可以在网络上传输,也可以本地存储然后读取。我们可以通过 Java 消息服务(Java Message Service)方式传递该对象(即通过网络传递一个对象),定义在消息队列中的数据类型为 ObjectMessage。

    public class Person implements Serializable {private String name;    // 省略 getter、setter
    }
  • 序列化及反序列化客户端代码:

    public class Producer
    {final static String FILE_NAME = "C:/obj.bin";public static void main(String[] args){Person person = new Person();person.setName("");SerializationUtils.writeObject(person, FILE_NAME);}
    }
    public class Conducer
    {final static String FILE_NAME = "C:/obj.bin";public static void main(String[] args){Person p = (Person)SerializationUtils.readObject(FILE_NAME);p.getName();}
    }
  • 其中的 SerializationUtils 工具类如下:

    public class SerializationUtils
    {// 序列化public static void writeObject(Serializable s, String filename){try{ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename));oos.writeObject(s);oos.close();} catch (Exception e){e.printStackTrace();}}// 反序列化public static Object readObject(String filename){Object obj = null;try{ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filename));ois.readObject();ois.close();} catch (Exception e){e.printStackTrace();}return obj;}
    }

2. UID 的必要性

正因为分布和异构,无论是读取本地文件还是远程调用,本地是无法在编译期获取待获取的类的完整信息的(成员变量和函数)。也即有可能发生,消息的生产者和消息的消费者所参考的类(Person)有差异,比如消息生产者的 Person 类添加一个年龄字段,而相应的消费者没有增加该属性。

这种序列化和反序列化的类不一致的情形下,反序列时有可能会报一个 InvalidClassException 异常。原因就在于序列化和反序列化所对应的类版本发生了变化,JVM 不能把数据流转换为实例对象。那么,JVM 是根据什么来判断一个类版本的呢?

通过 SerialVersionUID,也叫流标志符(Stream Unique Identifier)

public class Person implements Serializable {private static final long serialVersionUID = 55799L;
}

此时如果发生如下形式的不一致的情况,生产者增加年龄属性,消费端 Person 还保持以前的版本。此时,虽然物理上,生产者和消费者对应的类版本不同,但是显式声明的 serialVersionUID 相同,反序列化也可以运行,所带来的业务问题即是消费端无法读取新增的业务属性。

Serializable 接口与 Java 序列化与反序列化相关推荐

  1. Serializable详解(1):代码验证Java序列化与反序列化

    说明:本文为Serializable详解(1),最后两段内容在翻译上出现歧义(暂时未翻译),将在后续的Serializable(2)文中补充. 介绍:本文根据JDK英文文档翻译而成,本译文并非完全按照 ...

  2. java 序列化概念和作用_结合代码详细解读Java序列化与反序列化概念理解

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...

  3. Java中如何引用另一个类里的集合_【18期】Java序列化与反序列化三连问:是什么?为什么要?如何做?...

    Java序列化与反序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: 序列化:对象序列化的最主要的用处就是在传递和保存对象 ...

  4. java序列化与反序列化(转)

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列 ...

  5. java序列化和反序列化以及序列化ID的作用分析

     java序列化和反序列化 一.概念 java对象序列化的意思就是将对象的状态转化成字节流,以后可以通过这些值再生成相同状态的对象.对象序列化是对象持久化的一种实现方法,它是将对象的属性和方法转化为一 ...

  6. java序列化_夯实Java基础系列22:一文读懂Java序列化和反序列化

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  7. 教你彻底学会Java序列化和反序列化

    Java序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,Java反序列化是指把字节序列恢复为Java对象的过程.反序列化:客户端重文件,或者网络中获取到文件以后,在内存中重构对象 ...

  8. 理论 | 教你彻底学会Java序列化和反序列化

    这是小小本周的第四篇 Java序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,Java反序列化是指把字节序列恢复为Java对象的过程.反序列化:客户端重文件,或者网络中获取到文件 ...

  9. java序列化与反序列化总结

    很多商业项目用到数据库.内存映射文件和普通文件来完成项目中的序列化处理的需求,但是这些方法很少会依靠于Java序列化.本文也不是用来解释序列化的,而是一起来看看面试中有关序列化的问题,这些问题你很有可 ...

最新文章

  1. aes js 加盐值 解密_crypto-js aes加密解密
  2. 5G NR — Open vRAN 的组织单位
  3. [bzoj2324][ZJOI2011]营救皮卡丘
  4. 转变--一个平凡人的2017年总结及2018年展望
  5. python中json模块读写数据
  6. cas实现单点登录原理
  7. 过了一个有意义的愚人节
  8. 【华为云技术分享】STM32L476移植华为LiteOS系列教程------背景知识 1
  9. Comsenz 核心产品 Discuz! X3.3 正式版【2017-07-01】 -论坛搭建
  10. 【做题】agc002D - Stamp Rally——整体二分的技巧
  11. 防御DDoS 攻击的方法
  12. MUSIC算法原理以及详细推导
  13. java调用有道翻译接口
  14. 2007年7月27日
  15. Excel如何实现数据排列组合
  16. 巴菲特致股东的一封信:1991年
  17. RuntimeError: Unable to open shape_predictor_68_face_landmarks.dat
  18. 走出误区,老杨命运发生了转折
  19. DDR存储颗粒度大小
  20. PHP:Maze迷宫寻址算法(附完整源码)

热门文章

  1. 如何开发Web3D游戏
  2. php mysql合同跟踪,使用TCP协议进行路由跟踪
  3. python图像增强_使用Python进行图像增强
  4. linux部署多个jar 会宕机_我常用的自动化部署技巧,贼好用,推荐给大家!
  5. Android:自定义BaseActivity基类
  6. Java-旋转字符串
  7. hue 用oozie调度shell(sqoop)脚本问题
  8. 详解:Oracle数据库介绍 、字符、类型、语言
  9. word敲空格文字不后退_聊聊Word中的几种缩进(中)
  10. python爬虫大作业爬多少数据_爬虫大作业