概述

  • 序列化:将对象写入到 IO 流中
  • 反序列化:从 IO 流中恢复对象

实现方法

实现 Serializable 或者 Externalizable

  • Serializable:标记接口,不用实现任何方法,可以指定序列化 ID
  • Externalizable:增强的序列化标记接口,提供了 writeExternalreadExternal 两个接口方法,这两个方法在序列化和反序列化的过程中会被调用

注意,序列化 ID 只是一个版本号,两种方法都可以不指定,JVM 会根据类中的信息自动计算一个序列化版本号。不指定序列化版本号可能存在如下隐患:

  • 不同版本的 JVM 可能会有不同的计算规则,可能会导致类的信息完全一致但是序列化失败
  • 在类中的信息被修改后,由于 JVM 计算出来了不同的版本号,则很可能导致序列化失败

Serializable 和 Externalizable 的区别

  • 实现 Serializable 不用额外实现方法,但是实现 Externalizable 必须实现 writeExternalreadExternal 两个方法
  • 实现 Externalizable 必须要提供 public 修饰的无参构造器,否则会报错;Serializable 不需要无参构造器
  • 实现 Externalizable 必须把所有需要序列化的属性在 writeExternal 中一一手动序列化,所有需要反序列化的属性在 readExternal 中一一手动反序列化;SerializableJVM 自动完成

Serializable 的扩展点

  • 可以实现 private void writeObject(ObjectOutputStream out) 来自定义序列化逻辑,注意必须使用完全一致的方法名和 private 修饰符
  • 可以实现 private void readObject(ObjectInputStream in) 来自定义反序列化逻辑,注意必须使用完全一致的方法名和 private 修饰符
  • 当某个属性上加上了 transient 关键字后,这个属性将不会被序列化

注意点

  • 当一个序列化对象存在一个引用类型的对象时,这个对象也必须是可实例化的(或者加上 transient 关键字),否则会报错
  • 同一对象只会被序列化成二进制流一次,不会重复序列化
  • 单例类被序列化时,需要重写 readResolve 方法,否则会破环单例机制

Java 序列化总结.md相关推荐

  1. Java序列化的机制和原理

    有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍. Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述 ...

  2. java基础(十)-----Java 序列化的高级认识

    将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实现 Serializable 接口,使用 ...

  3. java序列化和RMI

    深入了解序列化"契约" 由于Java提供了良好的默认支持,实现基本的对象序列化是件比较简单的事.待序列化的Java类只需要实现Serializable接口即可.Serializab ...

  4. 什么是java序列化_什么是Java序列化?为什么序列化?序列化有哪些方式?

    先普及一下,计算机中无法识别一个基本单元[字节]来表示,必须经过"翻译"才能让计算机理解人类的语言,这个翻译过程就是[编码],通常所说的字符转换为字节. ?有I/O的地方机就会涉及 ...

  5. java kryo_kryo序列化 - Java序列化期间的错误

    我的应用程序有大量域对象,它们通过spring-session被序列化到Redis存储中.我试图使用Kryo(4.0.0)进行自动序列化,而不使对象明确可序列化.kryo序列化 - Java序列化期间 ...

  6. java 序列化慢_java原生序列化慢在哪里?

    Java原生序列化和二进制序列化性能比较 序列化速度 package com.clq.netty.serializable; import java.io.ByteArrayOutputStream; ...

  7. Java序列化的作用和反序列化

    1.序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存object states,但 ...

  8. Java序列化技术与Protobuff

    前言: Java序列化是Java技术体系当中的一个重要议题,序列化的意义在于信息的交换和存储,通常会和io.持久化.rmi技术有关(eg:一些orm框架会要求持久化的对象类型实现Serializabl ...

  9. 深入理解JAVA序列化

    2019独角兽企业重金招聘Python工程师标准>>> 如果你只知道实现 Serializable 接口的对象,可以序列化为本地文件.那你最好再阅读该篇文章,文章对序列化进行了更深一 ...

最新文章

  1. CMake 打包已经存在的动态库生成 target
  2. linux shell中小数的运算
  3. SAP QM 检验批上各个MIC质检结果的查询报表?
  4. gzcms技术开发文档
  5. 【.Net 学习系列】-- EF Core实践(Code First)
  6. s5pv210 音频播放问题 MPlayer移植
  7. Codeforces Round #168 (Div. 2)---A. Lights Out
  8. 44. xargs命令
  9. sqlite3x library
  10. 自已脚本开发常用的底层方法
  11. k8s实战之从私有仓库拉取镜像 - kubernetes
  12. Asp.net中web.config配置文件详解
  13. 简单java数组程序_java(数组及常用简单算法 )
  14. android去除标题栏和状态栏(全屏)
  15. mysql事务_MySQL事务提交过程(一)
  16. rs232读取智能电表_深度了解智能电度表,面板内容大揭秘!
  17. 项目管理十大知识领域和五大过程
  18. python实现阿里云盘同步功能(sync_folder)
  19. 详细分析《三合一收款码》后台程序识别原理
  20. 让临时停车号码牌会说话--鲁哇客智能挪车号码牌技术升级之路

热门文章

  1. oracle 增量_【干货分享】DMETL中的增量抽取初识
  2. PHP页面中嵌套go语言,go语言嵌套类型的使用细节
  3. SpringCloud Ribbon中的7种负载均衡策略!
  4. SpringBoot实现Excel导入导出,好用到爆,POI可以扔掉了!
  5. ThreadLocal内存溢出代码演示和原因分析!
  6. Zabbix配置模板监控指定服务器主机
  7. 服务发现与负载均衡traefik ingress
  8. 1002 写出这个数 (20分)-Java
  9. 彩票模拟选号程序java_java课程设计-彩票购买抽奖程序
  10. linux查看r的安装路径,在Linux CentOS 6.5版上安装R3.1.1的问题(检查LDFLAGS以获取Fortran库的路径)...