国外案例网站,做电商网站有什么用,wordpress免费资源,网站登录界面模板Java面试题之序列化和反序列化 文章目录 Java面试题之序列化和反序列化序列化和反序列化什么是序列化?什么是反序列化?如果有些字段不想进行序列化怎么办#xff1f;常见序列化协议有哪些#xff1f;为什么不推荐使用 JDK 自带的序列化#xff1f; 文章来自Java Guide 用于…Java面试题之序列化和反序列化 文章目录 Java面试题之序列化和反序列化序列化和反序列化什么是序列化?什么是反序列化?如果有些字段不想进行序列化怎么办常见序列化协议有哪些为什么不推荐使用 JDK 自带的序列化 文章来自Java Guide 用于学习如有侵权立即删除 序列化和反序列化
关于序列化和反序列化的详细解读请看这篇文章 Java 序列化详解 里面涉及到的知识点和面试题更全面。
什么是序列化?什么是反序列化?
如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中或者在网络传输 Java 对象这些场景都需要用到序列化。
简单来说
序列化将数据结构或对象转换成二进制字节流的过程反序列化将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程
对于 Java 这种面向对象编程语言来说我们序列化的都是对象Object也就是实例化后的类(Class)但是在 C这种半面向对象的语言中struct(结构体)定义的是数据结构类型而 class 对应的是对象类型。
下面是序列化和反序列化常见应用场景
对象在进行网络传输比如远程方法调用 RPC 的时候之前需要先被序列化接收到序列化的对象之后需要再进行反序列化将对象存储到文件之前需要进行序列化将对象从文件中读取出来需要进行反序列化将对象存储到数据库如 Redis之前需要用到序列化将对象从缓存数据库中读取出来需要反序列化将对象存储到内存之前需要进行序列化从内存中读取出来之后需要进行反序列化。
维基百科是如是介绍序列化的 序列化serialization在计算机科学的数据处理中是指将数据结构或对象状态转换成可取用格式例如存成文件存于缓冲或经由网络中发送以留待后续在相同或另一台计算机环境中能恢复原先状态的过程。依照序列化格式重新获取字节的结果时可以利用它来产生与原始对象相同语义的副本。对于许多对象像是使用大量引用的复杂对象这种序列化重建的过程并不容易。面向对象中的对象序列化并不概括之前原始对象所关系的函数。这种过程也称为对象编组marshalling。从一系列字节提取数据结构的反向操作是反序列化也称为解编组、deserialization、unmarshalling。 综上序列化的主要目的是通过网络传输对象或者说是将对象存储到文件系统、数据库、内存中。 https://www.corejavaguru.com/java/serialization/interview-questions-1
序列化协议对应于 TCP/IP 4 层模型的哪一层
我们知道网络通信的双方必须要采用和遵守相同的协议。TCP/IP 四层模型是下面这样的序列化协议属于哪一层呢
应用层传输层网络层网络接口层 如上图所示OSI 七层协议模型中表示层做的事情主要就是对应用层的用户数据进行处理转换为二进制流。反过来的话就是将二进制流转换成应用层的用户数据。这不就对应的是序列化和反序列化么
因为OSI 七层协议模型中的应用层、表示层和会话层对应的都是 TCP/IP 四层模型中的应用层所以序列化协议属于 TCP/IP 协议应用层的一部分。
如果有些字段不想进行序列化怎么办
对于不想进行序列化的变量使用 transient 关键字修饰。
transient 关键字的作用是阻止实例中那些用此关键字修饰的的变量序列化当对象被反序列化时被 transient 修饰的变量值不会被持久化和恢复。
关于 transient 还有几点注意
transient 只能修饰变量不能修饰类和方法。transient 修饰的变量在反序列化后变量值将会被置成类型的默认值。例如如果是修饰 int 类型那么反序列后结果就是 0。static 变量因为不属于任何对象(Object)所以无论有没有 transient 关键字修饰均不会被序列化。
常见序列化协议有哪些
JDK 自带的序列化方式一般不会用 因为序列化效率低并且存在安全问题。比较常用的序列化协议有 Hessian、Kryo、Protobuf、ProtoStuff这些都是基于二进制的序列化协议。
像 JSON 和 XML 这种属于文本类序列化方式。虽然可读性比较好但是性能较差一般不会选择。
为什么不推荐使用 JDK 自带的序列化
我们很少或者说几乎不会直接使用 JDK 自带的序列化方式主要原因有下面这些原因
不支持跨语言调用 : 如果调用的是其他语言开发的服务的时候就不支持了。性能差相比于其他序列化框架性能更低主要原因是序列化之后的字节数组体积较大导致传输成本加大。存在安全问题序列化和反序列化本身并不存在问题。但当输入的反序列化的数据可被用户控制那么攻击者即可通过构造恶意输入让反序列化产生非预期的对象在此过程中执行构造的任意代码。相关阅读应用安全JAVA 反序列化漏洞之殇 。 大家好我是xwhking一名技术爱好者目前正在全力学习 Java前端也会一点如果你有任何疑问请你评论或者可以加我QQ2837468248说明来意希望能够与你共同进步