写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。扫码加微信好友进【程序员面试学习交流群】,免费领取。也欢迎各位一起在群里探讨技术。

Java序列化就是将一个对象转化为一个二进制表示的字节数组,通过保存或则转移这些二进制数组达到持久化的目的。要实现序列化,需要实现java.io.Serializable接口。反序列化是和序列化相反的过程,就是把二进制数组转化为对象的过程。在反序列化的时候,必须有原始类的模板才能将对象还原。从这个过程我们可以猜测到,序列化过程并不想class文件那样保存类的完整的结构信息。下面我们以一个简单的例子来看一下,序列化的时候都保存了哪些信息。代码如下:

package com.ysl;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectOutputStream;import java.io.Serializable;public class SerializableTest implements Serializable{private static final long serialVersionUID = -1L;public int num = 2018;public static void main(String[] args){try {FileOutputStream fos = new FileOutputStream("serializable");ObjectOutputStream oos = new ObjectOutputStream(fos);SerializableTest test = new SerializableTest();oos.writeObject(test);oos.flush();oos.close();} catch (IOException e) {e.printStackTrace();}}}

序列化后的二进制字节数据如下:

aced 0005 7372 0018 636f 6d2e 7973 6c2e5365 7269 616c 697a 6162 6c65 5465 7374ffff ffff ffff ffff 0200 0149 0003 6e756d78 7000 0007 e2

上述的内容分为一下几个部分:

第一部分是序列化文件头

  • AC ED :STREAM_MAGIC声明使用了序列化协议
  • 00 05 :STREAM_VERSION序列化协议版本
  • 73 :TC_OBJECT声明这是一个新的对象

第二部分是序列化的类的描述,在这里是SerializableTest

  • 72 :TC_CLASSDESC声明这里开始一个新的class
  • 00 18:class名字的长度是24个字节
  • 636f 6d2e 7973 6c2e 5365 7269 616c 697a 6162 6c65 5465 7374:SerializableTest的完整类名
  • ffff ffff ffff ffff:serialVersionUID,序列化ID,如果没有指定,则会由算法随机生成一个8字节的ID
  • 02 :标记号,声明该类支持序列化
  • 00 01:该类所包含的域的个数为1

第三部分是对象中各个属性的描述

  • 49:域类型,49代表I,也就是int类型
  • 00 03:域名字的长度为3
  • 6e 75 6d:num属性的名称

第四部分为对象的父类信息描述

SerializableTest没有父类,如果有,和第二部分的描述相同

  • 78 :TC_ENDBLOCKDATA,对象块的结束标志
  • 70:TC_NUL:说明没有其他超类的标志

第五部分为对象属性的实际值

如果属性是一个对象,那么这里还将序列化这个对象,规则和第二部分一样

  • 00 0007 e2:数值2018

虽然Java的序列化能够保证对象状态的持久保存,但是遇到一些对象结构复杂的情况还是比较难处理的,下面是对一些复杂情况的总结:

  • 当父类实现了Serializable接口的时候,所有的子类都能序列化
  • 子类实现了Serializable接口,父类没有,父类中的属性不能被序列化(不报错,但是数据会丢失)
  • 如果序列化的属性是对象,对象必须也能序列化,否则会报错
  • 反序列化的时候,如果对象的属性有修改或则删减,修改的部分属性会丢失,但是不会报错
  • 在反序列化的时候serialVersionUID被修改的话,会反序列化失败
  • 在存Java环境下使用Java的序列化机制会支持的很好,但是在多语言环境下需要考虑别的序列化机制,比如xml,json,或则protobuf

转载:https://www.cnblogs.com/senlinyang/p/8204752.html

推荐内容:
一个两年Java的面试总结
Java面试经
Java面试集合(七)
Java多线程面试题
深入理解Java中的反射机制
一、面试准备-Java知识
Java的深拷贝和浅拷贝
Java面试题——中级
java面试题目
Java面试通关要点汇总集

Java序列化机制原理,java面试题,java基础笔试题,BAT相关推荐

  1. mysql 笔试题_MYSQL基础笔试题

    1.MySQL取得当前时间的函数是?,格式化日期的函数是 2.写出 SQL语句的格式 : 插入 ,更新 ,删除 表名User Name Tel Content Date 张三 13333663366 ...

  2. Java序列化机制和原理

    Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.Java序列化API提供一 ...

  3. Java序列化机制——protoStuff

    Java的序列化是在文件传输中必不可少的一部分.常用的Java序列化机制有Java默认的序列化机制,谷歌的protobuf等.而Java默认的序列化机制效率太低,protobuf要写protostuf ...

  4. 一篇文章搞定java序列化机制

    序列化与反序列化 序列化:将对象的状态信息转换为可以存储或传输的数据形式(比如二进制)的过程. 反序列化:与序列化相对,把序列化转换成的可以存储或传输的数据形式转化为对象的状态信息的过程. java序 ...

  5. java反射原理_java反射原理是什么?java反射机制原理详解

    前面给大家介绍了一下什么是java反射机制,那么下面要给大家介绍的就是java反射机制的原理,那么它的原理究竟是怎样的呢?下面就通过下面来做一下详细的了解吧. 首先我们再来介绍一下java反射机制. ...

  6. java序列化机制之protoStuff

    之前曾经写了两篇java的序列的机制,一种是默认的java序列化机制,这种方式效率太低.另外一种是谷歌的protobuf,但是这种我们还要写proto文件,并且我们还要使用工具来编译生成java文件, ...

  7. java 序列化 uid_一文看懂Java序列化之serialVersionUID

    serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的 ...

  8. 博学谷java题库判断_博学谷Java开发面试基础笔试题及答案分享

    博学谷Java开发面试基础笔试题分享:char 型变量中能不能存贮一个中文汉字?为什么?"=="和 equals 方法究竟有什么区别?静态变量和实例变量的区别?是否可以从一个 st ...

  9. Android开发面试经——2.常见Android基础笔试题

     标签: androidAndroid基础Android面试题Android笔试题 2015-03-12 15:04 3361人阅读 评论(3) 收藏 举报  分类: Android开发(29)  版 ...

最新文章

  1. 史上最强 NIO 框架,没有之一!!!
  2. python编程 语言-python程序设计语言
  3. PWN2OWN 2017 Linux 内核提权漏洞分析
  4. URI结构和ABNF操作符
  5. 【Python数据挖掘课程】七.PCA降维操作及subplot子图绘制
  6. 教你玩转CSS padding(填充)
  7. c++语言中如果调用函数时,需要改变实参或者返回多个值,应该采取,C++综合练习题2...
  8. IDEA 点击进入方法内部_一份最详细的 IDEA调试教程,让bug无处藏身!
  9. 带你了解PCIE通信原理
  10. c函数sscanf的高级技巧
  11. 学习Spring(一) -- 配置Spring
  12. Leetcode组队学习——分治
  13. 秒懂---LDA算法
  14. 2020蓝桥杯省赛模拟赛
  15. matlab符号运算报错,matlab符号运算符
  16. 常用1寸,2寸照片标准尺寸
  17. IDE也卷了,微软杀入嵌入式IDE
  18. sizeof 知多少
  19. Codeforces 786A Berzerk(博弈)
  20. 基于C语言的可靠数据传输协议的设计与实现

热门文章

  1. JQuery控制只能输入带二位小数的数字
  2. php 怎么查看原生方法源码_你的2020搜索账单地址入口 你的2020搜索账单怎么查看查看方法...
  3. 全球地区资料json 含中英文 经纬度_2020年Brain Bee北京、天津、河北赛区地区赛参赛说明...
  4. (29)基于FPGA实现看门狗功能(FPGA不积跬步101)
  5. (91)如何网表文件?
  6. (15)Verilog HDL宏定义:define
  7. FPGA时钟激励编写(方法二)
  8. 安卓手机鸿蒙系统怎么下载,华为鸿蒙系统来了:安卓系统会成为下一个“塞班”吗?...
  9. php取整数余数,js取整数、取余数的方法
  10. python 扩展_用Python方法对Cursor进行扩展