JAVA序列化技术-----二进制数据详细介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34446485/article/details/77893765

待序列化的对象有一个值是1000的属性num

package serializable.test;

 

import java.io.FileOutputStream;

import java.io.ObjectOutputStream;

import java.io.Serializable;

 

public class SerializableTestimplements Serializable {

/**

 *

 */

private static final long serialVersionUID = 1L;

public int num = 1000;

public static void main(String[]args) {

try {

//输出序列化对象到本地文件

FileOutputStream fos = new FileOutputStream("d:/data.dat");

ObjectOutputStream oos = new ObjectOutputStream(fos);

SerializableTest serializableTest = new SerializableTest();

oos.writeObject(serializableTest);

oos.flush();

oos.close();

} catch (Exception e) {

e.printStackTrace();

}

 

}

 

}

 

序列化二进制字节数据如图


第一部分 序列化文件头

AC ED-------声明使用了序列化协议 STREAM_MAGIC

00 05--------声明序列化协议版本 STREAM_VERSION

73 -----------声明这是一个新的对象 TC_OBJECT

第二部分

72 ---------- 声明这里开始一个新class  TC_CLASSDESC

00 22--------声明class名字的长度  10进制的34

7374------这部分声明了SerializableTest的完整类名

00 00 00 00 00 00 00 01是一个serialVersionUID,上面值为1L  这里都是16进制表示的

如果没有则由算法随机生成

02 ----------标记号,声明该对象是支持序列化的

00 01 -------声明该类所包含的域的个数是1

第三部分

对各个属性项的描述

49 ----------域类型 49代表IInt类型49十进制=73=ASCII的字幕I -->i的大写

00 03-----------域名字的长度
6E 75 6D -----num属性的名称

第四部分

 

输出该对象有无父类信息描述

如果有,数据格式和第二部分一样,

78 ---------- 对象块结束的标志 TC_ENDBLOCKDATA

70 ---------- 说明没有其他超类 TC_NULL

第五部分

 

00 00 03 E8 -----10进制 1000的数值

检验

public int num = 5000;

运行得到序列化数据

 

 

显示只有最后几位代表的属性的值的位数会改变,其他不变

删除serialVersionUID

 

仅仅serialVersionUID改变,由随机数组成

 

修改serialVersionUID 

private static final long serialVersionUID = 888888888888L;

 

000000CEF5E80E38H=888888888888L

修该属性名为 public int count = 5000;  

 

属性长度已经变为00 05,代表属性名的长度

63 6F 75是属性长度,count

70 78不变, 00 00 13 88 =5000不变

修改类型省略

总结:

 

1、当父类继承Serializable接口时,所有子类都可以被序列化

2、子类实现了该接口,父类没有,父类的属性不能序列化(不报错,数据会丢失),但是子类可以正常序列化

3、如果序列化的属性是对象,则这个对象也必须实现该接口,否则会报错

4、在反序列化的时候,如果对象的属性有修改或删减,则修改或删减的部分属性会丢失。但不会报错

5、在反序列化时,如果serialVersionUID被修改,则反序列化时会失败

6、这种序列化是java的序列化手段,很难用其他语言还原,如果考虑到其他语言使用通用数据结构JSON/XMLRMI就是使用这种序列化

参考《深入分析javaweb技术内幕》


展开阅读全文

没有更多推荐了,返回首页