首页 > 编程语言 > 详细

Java基础(十一)--序列化Serializable详解

时间:2019-06-16 15:00:45      阅读:121      评论:0      收藏:0      [点我收藏+]

  序列化在日常开发中经常用到,特别是涉及到网络传输的时候,例如调用第三方接口,通过一个约定好的实体进行传输,这时你必须实现序列

化,这些都是大家都了解的内容,所以文章也会讲一下序列化的高级内容。

序列化与反序列化简单认知:

  我们知道,对象在不具有可达性的时候,会被GC,这些对象都是保存在堆中,而现实中,我们可能需要将对象进行持久化,并且在需要的时候

进行读取转换,这就是序列化的工作。

1、序列化: 

  将一个对象转换成字节流或者说是字节数组,并且可以存储或传输的形式的过程。

  存储:可以把一个对象存储到文件、数据库等

  网络传输:可以转化成字节或XML进行网络传输

2、反序列化:

  和序列化是一个相反的过程,在需要的时候,把字节数组转化成对象。

序列化广泛应用于远程调用等所有涉及网络传输的地方

序列化相关接口:

Serializable、Externalizable、ObjectOutput、ObjectInput、ObjectOutputStream、ObjectInputStream

Serializable接口:

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Student implements Serializable {

    private int id;
    private String name;
    private int sex;
    private transient String addr;
} 
public static void main(String[] args) throws Exception{
	Student student = new Student(1001, "sam", 1, "SH");
	File file = new File("D:\\a.txt");
	FileOutputStream fileOutputStream = new FileOutputStream(file);
	ObjectOutputStream outputStream = new ObjectOutputStream(fileOutputStream);
	outputStream.writeObject(student);
	outputStream.close();

	ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(file));
	Student student1 = (Student)inputStream.readObject();
	System.out.println(student1.toString());
	inputStream.close();
}

结果:

Student(id=1001, name=sam, sex=1, addr=null)

  我们通过Binary Viewer查看这个二进制文件a.txt,下面二进制内容解释参考自:https://www.cnblogs.com/xrq730/p/4821958.html

技术分享图片

第一部分:序列化文件头

  1、AC ED:STREAM_MAGIC序列化协议

  2、00 05:STREAM_VERSION序列化协议版本

  3、73:TC_OBJECT声明这是一个新的对象

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

  1、72:TC_CLASSDESC声明这里开始一个新的class

  2、00 18:十进制的24,表示class名字的长度是24个字节

  3、63 6F 6D ... 6E 74 20:表示的是“com.it.exception.Student”这一串字符,可以数一下确实是24个字节

  4、00 00 00 00 00 00 00 01:SerialVersion,序列化ID,1

  5、02:标记号,声明该对象支持序列化

  6、00 03:该类所包含的域的个数为3个

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

  1、49:int类型

  2、00 02:十进制的2,表示字段长度

  3、69 64:表示字段id

  4、49:int类型

省略了sex、name属性,可以自行查看

  5、74:TC_STRING,代表一个new String,用String来引用对象

第四部分:该对象父类的信息,如果没有父类就没有这部分。有父类和第2部分差不多

  1、00 12:十进制的18,表示父类的长度

  2、4C 6A 61 ... 6E 67 3B:“L/java/lang/String;”表示的是父类属性

  3、78:TC_ENDBLOCKDATA,对象块结束的标志

  4、70:TC_NULL,说明没有其他超类的标志

第五部分:输出对象的属性项的实际值,如果属性项是一个对象,这里还将序列化这个对象,规则和第2部分一样

  1、00 03:十进制的3,属性的长度

  2、73 61 6D:字符串"sam",name的属性值

以上是二进制文件的解析,可以得出结论:

  1、序列化之后保存的是对象的信息

  2、被声明为transient的属性不会被序列化,这就是transient关键字的作用,addr字段并没有保存

所以,我们得出结论,static字段也不会被序列化,因为static变量属于类的

 

Java基础(十一)--序列化Serializable详解

原文:https://www.cnblogs.com/huigelaile/p/11031341.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!