有没有什么设计排版类网站,出口电商平台有哪些,嘉兴做网站公司,《网页设计与制作》实验报告1 什么是序列化、反序列化 在Java编程实践中#xff0c;当我们需要持久化Java对象#xff0c;比如把Java对象保存到文件里#xff0c;或是在网络中传输Java对象时#xff0c;序列化机制就发挥着关键作用。 序列化#xff1a;指的是把数据结构或对象转变为可存储、可传输的…
1 什么是序列化、反序列化 在Java编程实践中当我们需要持久化Java对象比如把Java对象保存到文件里或是在网络中传输Java对象时序列化机制就发挥着关键作用。 序列化指的是把数据结构或对象转变为可存储、可传输的格式常见的是二进制字节流当然像JSON、XML这类文本格式也可用于序列化。 反序列化则是将序列化过程中生成的数据还原成原始数据结构或对象的操作。 在Java这门典型的面向对象编程语言里我们序列化的对象本质上是类Class实例化后的产物。这一点和C有所不同在C这种兼具面向对象和面向过程特性的语言中struct主要用于定义数据结构类型class才对应对象类型。 序列化与反序列化有着广泛的应用场景 ①网络通信在对象进行网络传输比如远程方法调用RPC时发送前必须先完成序列化接收方收到序列化后的对象还得进行反序列化才能正常使用。 ②文件存储将对象保存到文件前需要先序列化后续从文件中读取对象时则要执行反序列化操作这样才能把存储的内容还原成可用的对象。 ③数据库交互当把对象存入数据库如Redis序列化不可或缺从缓存数据库中读取对象时反序列化同样必不可少确保数据能以正确的对象形式被程序处理。 ④内存操作在将对象存入内存前需要序列化从内存读取对象后通过反序列化让对象恢复到可操作状态。 维基百科对序列化的定义为在计算机科学的数据处理领域序列化是把数据结构或对象状态转化为可读取格式的过程这些格式可以存入文件、缓存或者在网络中传输以便后续在相同或不同的计算机环境里能够恢复对象的原始状态。按照序列化格式重新获取字节就能生成和原始对象语义相同的副本。不过对于很多包含大量引用的复杂对象实现这种序列化重建的过程颇具挑战。在面向对象编程中对象序列化并不涵盖原始对象关联的函数这一过程也叫对象编组marshalling。而从一系列字节中提取数据结构的逆向操作就是反序列化也叫解编组、deserialization、unmarshalling 。 总的来说序列化的核心目的是让对象能够通过网络传输或是将其存储到文件系统、数据库、内存等介质中为Java程序在数据持久化与通信交互场景下提供了至关重要的技术支持 是Java开发者必须掌握的关键技术点。 2 序列化协议对应于 TCP/IP 4 层模型的哪一层
网络通信的双方必须要采用和遵守相同的协议。TCP/IP 四层模型是下面这样的序列化协议属于哪一层呢
应用层传输层网络层网络接口层 如上图所示OSI 七层协议模型中表示层做的事情主要就是对应用层的用户数据进行处理转换为二进制流。反过来的话就是将二进制流转换成应用层的用户数据。这就对应的是序列化和反序列化么
因为OSI 七层协议模型中的应用层、表示层和会话层对应的都是 TCP/IP 四层模型中的应用层所以序列化协议属于 TCP/IP 协议应用层的一部分。
3 常见序列化协议有哪些
JDK 自带的序列化方式一般不会用 因为序列化效率低并且存在安全问题。比较常用的序列化协议有 Hessian、Kryo、Protobuf、ProtoStuff这些都是基于二进制的序列化协议。
像 JSON 和 XML 这种属于文本类序列化方式。虽然可读性比较好但是性能较差一般不会选择。
JDK 自带的序列化方式
JDK 自带的序列化只需实现 java.io.Serializable接口即可。
AllArgsConstructor
NoArgsConstructor
Getter
Builder
ToString
public class RpcRequest implements Serializable {private static final long serialVersionUID 1905122041950251207L;private String requestId;private String interfaceName;private String methodName;private Object[] parameters;private Class?[] paramTypes;private RpcMessageTypeEnum rpcMessageTypeEnum;
}
Kryo
Kryo 是一个高性能的序列化/反序列化工具由于其变长存储特性并使用了字节码生成机制拥有较高的运行速度和较小的字节码体积。
另外Kryo 已经是一种非常成熟的序列化实现了已经在 Twitter、Groupon、Yahoo 以及多个著名开源项目如 Hive、Storm中广泛的使用。序列化和反序列化相关的代码如下
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;public class KryoSerializer {private static final ThreadLocalKryo kryoThreadLocal ThreadLocal.withInitial(() - {Kryo kryo new Kryo();kryo.register(RpcRequest.class);return kryo;});public static byte[] serialize(RpcRequest request) {try (ByteArrayOutputStream bos new ByteArrayOutputStream();Output output new Output(bos)) {Kryo kryo kryoThreadLocal.get();kryo.writeObject(output, request);return output.toBytes();} catch (Exception e) {throw new RuntimeException(e);}}public static RpcRequest deserialize(byte[] bytes) {try (ByteArrayInputStream bis new ByteArrayInputStream(bytes);Input input new Input(bis)) {Kryo kryo kryoThreadLocal.get();return kryo.readObject(input, RpcRequest.class);} catch (Exception e) {throw new RuntimeException(e);}}
}
Protobuf
Protobuf 出自于 Google性能还比较优秀也支持多种语言同时还是跨平台的。就是在使用中过于繁琐因为你需要自己定义 IDL 文件和生成对应的序列化代码。这样虽然不灵活但是另一方面导致 protobuf 没有序列化漏洞的风险。 Protobuf 包含序列化格式的定义、各种语言的库以及一个 IDL 编译器。正常情况下你需要定义 proto 文件然后使用 IDL 编译器编译成你需要的语言 一个简单的 proto 文件如下
// protobuf的版本
syntax proto3;
// SearchRequest会被编译成不同的编程语言的相应对象比如Java中的class、Go中的struct
message Person {//string类型字段string name 1;// int 类型字段int32 age 2;
}