序列化
序列化是什么?
序列化是将数据或对象转换为一系列字节或其他格式的过程
为什么要进行序列化 ?
-
数据交换。当我们需要在两个应用程序之间传递数据时,如果两个程序用的是不同的程序语言和数据格式,传递对象时可能出现问题。
通过序列化,可以将对象转换为一种通用格式
-
持久化数据。例如,一个游戏可能需要保存游戏进度,以便在下次打开时继续进行游戏。通过序列化,可以将游戏进度对象转换为字节序列,然后将其保存到磁盘上。在下次打开游戏时,可以使用反序列化将字节序列转换回原始对象,以便恢复游戏进度。
将数据保存到磁盘上需要序列化,数据在磁盘上存储形式通常是字节流。
常见的序列化方法:
-
Java原生序列化:
使用Java标准库提供的序列化机制实现将Java对象序列化为字符流的过程,也就是将Java对象转换为可以存储或传输的格式,以便在需要时可以进行反序列化操作,将字节流转换回原始的Java对象。
如果一个类实现了Serializable接口,它的所有非静态成员变量都会被自动序列化。
如果某个成员变量不需要被序列化,可以用transient关键字来修饰。另外,如果某个类有父类,那么它的父类也必须实现Serializable接口。
serialVersionUID
serialVersionUID是Java序列化机制中的一个重要概念,它是一个长整型的序列化版本号,用于标识一个序列化类的版本信息。在Java序列化时,会将serialVersionUID写入序列化数据中,以便在反序列化时进行校验,确保序列化和反序列化的数据版本一致。
作用:
-
版本控制:当一个Java类实现了Serializable接口并被序列化后,如果在之后对该类进行了修改,例如增加或删除了成员变量或方法,那么它的serialVersionUID就会发生变化。当反序列化时,Java虚拟机会将serialVersionUID与被反序列化类的serialVersionUID进行比较,如果不一致就会抛出InvalidClassException异常,以避免反序列化不兼容的类。
兼容升级:不修改serialVersionUID字段
不兼容升级:修改serialVersionUID字段
-
跨平台兼容性:由于Java序列化机制可以在不同平台、不同Java版本之间进行数据传输,使用serialVersionUID可以保证不同平台、不同Java版本的程序可以正确地反序列化序列化数据,避免因为版本不一致导致的错误。
-
性能优化:如果不指定serialVersionUID,Java序列化机制会根据被序列化类的成员变量自动生成serialVersionUID,这可能会导致每次序列化和反序列化时都要进行计算和比较,降低性能。而手动指定serialVersionUID可以避免这种计算和比较,提高性能。
-
-
Json序列化
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于Web应用中的数据传输。JSON序列化是指将Java对象序列化为JSON格式的字符串,以便在网络上传输或存储到文件系统中。相比Java原生的序列化机制,JSON序列化有着更好的可读性和可移植性,因此在Web应用中被广泛使用。
Java中有多个流行的JSON序列化库,如Gson、Jackson和Fastjson等。这些库都提供了非常方便的API来进行Java对象和JSON格式之间的转换。
Json序列在序列化过程中抛弃了类型信息,所以反序列化时提供类型信息才能准确反序列化
大部分序列化的过程中,确实都会将对象序列化为二进制格式的字节流。序列化的过程中,将对象的数据转化为二进制流的过程称为"编组"或"串行化",而将二进制流转化为原始对象的过程则称为"解组"或"反串行化"。
当然,也有一些序列化方式(如JSON和XML),会将对象序列化为文本格式,而不是字节流。在这些序列化方式中,对象的属性信息被表示为键值对或属性值对的形式,并以特定的文本格式进行编码。无论是字节流还是文本格式,序列化的目的都是为了将对象在网络中或在磁盘上进行传输或存储,以便后续使用。