java序列化的方法 Java面试之序列化与反序列化

时间:2024-02-27 11:45:10/人气:431 ℃

首先,在java开发中之所以需要序列化,核心目的是为了解决网络通信之间的对象传输问题。也就是说,如何把当前JVM进程里面的一个对象,跨网络传输到另一个JVM进程里面。

Java序列化与反序列化

序列化,就是把内存里面的对象转化为字节流,以便用来实现存储或者传输。

反序列化,就是根据从文件或者网络上获取到的对象的字节流,根据字节流里面保存的对象描述信息和状态重新构建一个新的对象。

其次呢,序列化的前提是保证通信双方对于对象的可识别性,所以很多时候,我们会把对象转化为通用的解析格式,比如JSON、xml等。然后再把它们转化为数据流进行网络传输,从而实现跨平台和跨语言的可识别性。

最后,关于序列化的选择,开源的序列化技术非常多,比如Xml,Json,Thrift,Protobuf等

XML(可扩展标记语言)

优点:人机可读性好,可指定元素或特性的名称。

缺点:序列化数据只包含数据本身以及类的结构,不包括类型标识和程序集信息。只能序列化公共属性和字段,不能序列化方法。文件庞大,文件格式复杂,传输占带宽。

适用场景:当做配置文件存储数据,实时数据转换。

JSON(JS对象简谱,是一种轻量级的数据交换格式)

优点:兼容性高、数据格式比较简单,易于读写、序列化后数据较小,可扩展性好,兼容性好与XML相比,其协议比较简单,解析速度比较快。

缺点:数据的描述性比XML差、不适合性能要求为ms级别的情况、额外空间开销比较大。

适用场景(可替代XML):跨防火墙访问、可调式性要求高、基于Web browser的Ajax请求。传输数据量相对小,实时性要求相对低(例如秒级别)的服务。

Thrift(不仅是序列化协议,还是一个RPC框架)

优点:序列化后的体积小,速度快。支持多种语言和丰富的数据类型,对于数据字段的增删具有较强的兼容性,支持二进制压缩编码。

缺点:使用者较少,跨防火墙访问时不安全不具有可读性,调试代码时相对困难。不能与其他传输层协议共同使用(例如 HTTP),无法支持向持久层直接读写数据,即不适合做数据持久化序列化协议。

适用场景:分布式系统的RPC解决方案。

Protocol Buffers

将数据结构以.proto文件进行描述,通过代码生成工具可以生成对应数据结构的POJO对象和Protobuf相关的方法和属性。

优点:序列化后码流小,性能高、结构化数据存储格式(XML JSON 等)。通过标识字段的顺序,可以实现协议的前向兼容、结构化的文档 更容易管理和维护。

缺点:需要依赖于工具生成代码、支持的语言相对较少,官方只支持Java、C 、python。

适用场景:对性能要求高的RPC调用、具有良好的跨防火墙的访问属性、适合应用层对象的持久化。

JDK类库提供的序列化API:

java.io.ObjectOutputStream。表示对象输出流,其中writeObject(Object obj)方法可以将给定参数的obj对象进行序列化,将转换的一连串的字节序列写到指定的目标输出流中。

java.io.ObjectInputStream。该类表示对象输入流,该类下的readObject(Object obj)方法会从源输入流中读取字节序列,并将它反序列化为一个java对象并返回。

java.io.Serializable。是一个标志性接口,标识可以在JVM中进行序列化,JVM会为该类自动生成一个序列化版本号。参与序列化与反序列化的类必须实现Serializable接口。

private static final long serialVersionUID = 1234L。类属性,序列化版本号,用于给JVM 区别同名类,没有提供版本号,JVM会默认提供序列化版本号。

transient。关键字,当序列化时,不希望某些属性参与,则可以使用这个关键字标注该属性。

需要注意的是,被序列化的Java对象必须实现Serializable接口,否则会抛出NotSerializableException异常。另外,序列化和反序列化的Java对象必须是同一版本,否则会出现InvalidClassException异常。

Java序列化的步骤如下:

创建一个实现Serializable接口的Java对象。

创建一个ObjectOutputStream对象,将该对象写入字节流中。

关闭ObjectOutputStream对象。

Java反序列化的步骤如下:

创建一个ObjectInputStream对象。

从ObjectInputStream对象中读取字节流。

使用readObject()方法将字节流转换为Java对象。

关闭ObjectInputStream对象。

但在实际应用里面,序列化组件的选择,我认为有几个关键因素。

1.序列化之后的数据大小,因为数据大小会影响传输性能。

2.序列化的性能,序列化耗时较长会影响业务的性能。

3.是否支持跨平台和跨语言。

4.技术的成熟度,越成熟的方案使用的公司越多,也就越稳定。

推荐

  • 1英语学习计划书如何写499
  • 2大学生思想政治教育工作自查报告110
  • 3丰胸瑜伽怎么练的方法及动作216
  • 4怎样在家教育孩子314
  • 5后天八卦配五行322
  • 6关于人生的个性签名322
  • 7《红岩》有感489
  • 8大学生心理健康手抄报设计版面482
  • 9网红密子君回应卖鸡脚时出现蟑螂,网红密子君直播带货现蟑螂374
  • 10黄鳝习性百科知识:黄鳝的特性488
  • 首页/电脑版/地图
    © 2024 OONiu.Com All Rights Reserved.