序列化框架的选择- hession2、kyro、protostuff

前言

当涉及到序列化框架时,Hessian 2、Kryo 和 Protostuff 是三个常见的选择。它们在性能、跨语言支持、序列化大小和使用灵活性等方面存在一些差异。hession2、kyro、protostuff都是第三方开源的序列化/反序列化框架,要了解其各自的特性,我们首先需要知道序列化/反序列化是什么:

序列化和反序列化是将对象转换为字节流(序列化)以及将字节流转换回对象(反序列化)的过程。

序列化:
序列化是指将对象转换为字节流的过程,以便将其存储在文件、数据库或通过网络进行传输。在序列化期间,对象的状态(属性值)被转换为字节序列,可以包括对象的字段、方法、类信息等。这个字节流可以被保存或传输,以便在需要时进行恢复或重建对象。

反序列化:
反序列化是指将字节流恢复为对象的过程。在反序列化期间,字节流被读取并转换回原始对象的状态。这包括重新构造对象、恢复字段值、还原方法和类信息等。通过反序列化,我们可以在不同的应用程序或计算机之间传输对象,以及从持久化存储中读取对象并还原为内存中的对象。

Hessian 2

Hessian 2 是一种轻量级的二进制序列化协议,用于在不同平台和语言之间进行对象序列化和反序列化。它是由 Caucho Technology 开发的,并且在 Java 社区中被广泛使用。

Hessian 2 具有以下特点和优势:

  • 跨语言支持:Hessian 2 的设计目标之一是实现跨语言的互操作性。它提供了对多种编程语言的支持,包括 Java、C#、Python、Ruby、JavaScript 等。这使得不同语言的应用程序能够相互通信并共享序列化数据。
  • 快速和高效:Hessian 2 在序列化和反序列化方面具有良好的性能表现。它采用了高效的二进制编码方式,使得序列化的字节流较小且传输效率高。相比于其他文本格式的序列化方式(如 XML 和 JSON),Hessian 2 可以更快地将对象转换为字节流并进行传输。
  • 简单易用:Hessian 2 提供了简单易用的 API,使得开发人员可以轻松地进行对象的序列化和反序列化操作。它支持将 Java 对象转换为字节流,并能够将字节流反序列化为原始的 Java 对象。
  • 兼容性:Hessian 2 具有良好的跨平台和兼容性。不同平台和语言之间可以使用相同的 Hessian 2 协议进行通信,从而实现互操作性和数据交换。
  • 支持网络传输:Hessian 2 可以与各种网络协议结合使用,例如 HTTP 和 TCP。它能够将序列化的字节流通过网络进行传输,并在接收端进行反序列化,从而支持远程过程调用(RPC)和分布式系统间的数据交换。

总的来说,Hessian 2 是一种高效、跨语言的二进制序列化协议,适用于在不同平台和语言之间进行对象序列化和网络通信。它具有快速、简单易用以及良好的兼容性等特点,使得开发人员能够更方便地进行跨平台的数据交换和系统集成。

Kryo

Kryo 是一个高性能的 Java 序列化框架,旨在快速且紧凑地序列化对象。它被广泛用于分布式系统、缓存、消息传递等场景中,以提高数据传输和存储的效率。以下是 Kryo 的介绍:

  • 高性能:Kryo 的设计目标是提供极快的序列化和反序列化速度。相比于一些传统的序列化框架,如 Java 的默认序列化机制,Kryo 在性能方面通常表现出更好的效果。它采用了高度优化的序列化算法和数据结构,以提高序列化和反序列化的速度。
  • 紧凑的序列化格式:Kryo 生成的序列化字节流通常非常紧凑,这意味着它所占用的存储空间相对较小。较小的序列化大小可以减少网络传输的带宽占用,并降低存储成本。
  • 支持多种数据类型:Kryo 能够序列化和反序列化各种数据类型,包括原始类型(如整数、浮点数)、集合(如列表、映射)、自定义对象等。它还提供了对复杂对象图的支持,能够处理对象之间的引用关系。
  • 注册机制:Kryo 支持注册机制,可以显式注册类以提高序列化和反序列化的性能。通过注册类,Kryo 可以在序列化过程中使用类的编号而不是类的全限定名,从而减少序列化字节流的大小。
  • 跨平台兼容性:Kryo 是一个纯 Java 实现的序列化框架,因此在不同的 Java 平台上具有良好的兼容性。它可以与许多主流的 Java 框架和库无缝集成,如 Apache Spark、Hadoop、Akka 等。

需要注意的是,Kryo 是为 Java 开发的序列化框架,因此它的跨语言支持相对有限。如果需要在不同的编程语言之间进行跨语言的序列化和反序列化,可能需要配合其他跨语言的序列化协议或框架。

总的来说,Kryo 是一个高性能、紧凑且易于使用的 Java 序列化框架。它在性能和序列化大小方面表现出色,可以提高数据传输和存储的效率,适用于多种场景,包括分布式系统通信、缓存和消息传递等。

Protostuff

Protostuff 是一个基于 Protocol Buffers 的高性能序列化框架,旨在提供快速、紧凑和可扩展的对象序列化和反序列化功能。它是在 Java 平台上开发的,可以在分布式系统、缓存、消息传递等场景中广泛应用。以下是 Protostuff 的介绍:

  • 基于 Protocol Buffers:Protostuff 是基于 Google 的 Protocol Buffers 序列化协议的框架。Protocol Buffers 是一种语言无关、平台无关的序列化格式,具有紧凑的二进制表示和高效的解析性能。Protostuff 在 Protocol Buffers 的基础上提供了更简单的 API 和更好的集成体验。
  • 高性能:Protostuff 的设计目标是提供高性能的序列化和反序列化操作。它通过使用代码生成和缓存技术来避免反射的开销,并采用高效的编解码算法,以提高序列化和反序列化的速度。
  • 紧凑的序列化格式:Protostuff 生成的序列化字节流通常非常紧凑,这意味着它所占用的存储空间相对较小。这可以减少网络传输的带宽占用,并降低存储成本。
  • 支持多种数据类型:Protostuff 能够序列化和反序列化多种数据类型,包括原始类型、集合、自定义对象等。它还支持处理复杂对象图和对象之间的引用关系。
  • 注解驱动:Protostuff 使用注解来定义对象的序列化和反序列化规则。通过简单的注解配置,可以控制序列化和反序列化的行为,并对字段进行定制化处理。
  • 跨语言兼容性:由于 Protostuff 是基于 Protocol Buffers 的框架,因此可以与其他支持 Protocol Buffers 的编程语言进行跨语言的对象序列化和反序列化。这使得不同语言的应用程序能够相互通信和共享序列化数据。

总的来说,Protostuff 是一个高性能、紧凑且易于使用的序列化框架,基于 Protocol Buffers 的协议。它具有快速的序列化和反序列化速度,紧凑的序列化格式以及跨语言兼容性的优势。Protostuff 在分布式系统通信、缓存、消息传递等场景中具有广泛的应用前景。

性能对比

Hessian 2、Kryo 和 Protostuff 都是具有良好性能的序列化框架,但它们在性能方面可能有一些差异。以下是它们的性能对比:

Hessian 2:

  • Hessian 2 在序列化和反序列化性能方面表现良好。
  • 它通常比较快速且具有较高的吞吐量。
  • Hessian 2 的序列化字节流相对较小,可以节省存储空间和网络带宽。

Kryo:

  • Kryo 是一个专注于性能的序列化框架,以快速和紧凑的序列化著称。
  • 它在序列化和反序列化速度方面非常出色,往往比其他框架更快。
  • Kryo 生成的序列化字节流较小,可以减少存储和传输成本。

Protostuff:

  • Protostuff 是基于 Protobuf 的序列化框架,具有较高的性能。
  • 它在序列化和反序列化速度上表现良好,与其他框架相比可能略逊一筹。
  • Protostuff 生成的序列化字节流通常较小,因此可以节省存储和传输资源。

生成的序列化字节流(占用空间)由大到小:Kryo>Protostuff>Hessian 2
性能:在性能方面,Kryo 是三个框架中最快的,而Hessian 2 也具有很好的性能表现。Protostuff 的性能也较高,但可能略逊一筹。

需要注意的是,性能对比结果可能会受到多个因素的影响,包括对象的复杂性、数据大小、框架的配置和使用方式等。因此,实际性能可能因具体的使用场景而有所差异。对于特定的应用和数据类型,进行自己的性能测试和评估是最好的方式,以便选择最适合的序列化框架。

其他比较

  • 跨语言支持:Hessian 2 是为了在不同语言之间进行通信而设计的,具有良好的跨语言兼容性。而 Kryo 和 Protostuff 主要用于 Java 应用程序,不具备直接跨语言支持。
  • 序列化大小:Hessian 2 和 Protostuff 生成的序列化字节流相对较小,可以减少存储和传输成本。Kryo 也能生成紧凑的字节流,但在某些情况下,它可能会产生比其他两个框架更大的序列化大小。
  • 使用灵活性:Kryo 提供了更多的灵活性,可以序列化各种数据类型,包括自定义对象和原始类型。Hessian 2 和 Protostuff 对于处理复杂对象关系有一定的优势。

综合而言,选择适合您需求的序列化框架需要考虑性能、跨语言支持、序列化大小和使用灵活性等因素。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Steger算法是一种基于边缘检测的算法,可以用于检测图像中的线条或边缘。在激光光条中心提取方面,可以将激光光条看作是一条边缘,然后使用Steger算法来提取其中心。 具体实现步骤如下: 1. 首先,读取激光光条的图像,并将其转换为灰度图像。 2. 利用Hessian矩阵计算图像中所有像素点的边缘响应值。 3. 对于每个像素点,计算其对应的边缘方向。 4. 对于每个像素点,找到其在边缘方向上的最大响应值,并将该响应值作为该像素点的权值。 5. 对于每个像素点,计算其在边缘方向上的加权平均值,并将该值作为该像素点所属的激光光条中心的位置。 6. 对于所有激光光条中心位置,进行滤波以消除噪声。 7. 最终,得到激光光条的中心位置信息。 下面是一个基于Python的Steger算法的实现示例: ```python import cv2 import numpy as np def calculate_edge_response(img): # 计算Hessian矩阵 Hxx = cv2.Sobel(img, cv2.CV_64F, 2, 0, ksize=3) Hyy = cv2.Sobel(img, cv2.CV_64F, 0, 2, ksize=3) Hxy = cv2.Sobel(img, cv2.CV_64F, 1, 1, ksize=3) Hessian = np.zeros_like(img, dtype=np.float64) for i in range(img.shape[0]): for j in range(img.shape[1]): H = np.array([[Hxx[i,j], Hxy[i,j]], [Hxy[i,j], Hyy[i,j]]]) Hessian[i,j] = np.linalg.det(H) - 0.04 * np.trace(H) ** 2 # 对Hessian矩阵进行非极大值抑制 edge_response = np.zeros_like(img, dtype=np.float64) for i in range(1, img.shape[0]-1): for j in range(1, img.shape[1]-1): if Hessian[i,j] > 0 and \ Hessian[i,j] > Hessian[i-1,j-1] and \ Hessian[i,j] > Hessian[i-1,j] and \ Hessian[i,j] > Hessian[i-1,j+1] and \ Hessian[i,j] > Hessian[i,j-1] and \ Hessian[i,j] > Hessian[i,j+1] and \ Hessian[i,j] > Hessian[i+1,j-1] and \ Hessian[i,j] > Hessian[i+1,j] and \ Hessian[i,j] > Hessian[i+1,j+1]: edge_response[i,j] = Hessian[i,j] return edge_response def calculate_edge_direction(img): # 计算边缘方向 dx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) dy = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3) angle = np.arctan2(dy, dx) angle[angle < 0] += np.pi return angle def calculate_center(img, angle): # 计算每个像素点在边缘方向上的权值 weight = img * np.cos(angle) ** 2 # 计算每个像素点所属的激光光条中心的位置 center = np.zeros_like(img, dtype=np.float64) for i in range(1, img.shape[0]-1): for j in range(1, img.shape[1]-1): if weight[i,j] > 0: x = int(np.round(i + weight[i,j] * np.sin(angle[i,j]))) y = int(np.round(j + weight[i,j] * np.cos(angle[i,j]))) if x >= 0 and x < img.shape[0] and y >= 0 and y < img.shape[1]: center[x,y] += 1 return center def filter_center(center): # 对激光光条中心位置进行滤波 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5)) center = cv2.erode(center, kernel) center = cv2.dilate(center, kernel) return center if __name__ == '__main__': # 读取激光光条图像 img = cv2.imread('laser.png', cv2.IMREAD_GRAYSCALE) # 计算边缘响应值和边缘方向 edge_response = calculate_edge_response(img) angle = calculate_edge_direction(edge_response) # 计算激光光条中心位置 center = calculate_center(edge_response, angle) # 进行滤波 center = filter_center(center) # 显示结果 cv2.imshow('Laser Center', center) cv2.waitKey(0) cv2.destroyAllWindows() ``` 其中,`calculate_edge_response`函数用于计算Hessian矩阵,并对其进行非极大值抑制,得到边缘响应值;`calculate_edge_direction`函数用于计算边缘方向;`calculate_center`函数用于计算每个像素点在边缘方向上的权值,并将该像素点所属的激光光条中心的位置累加到相应的位置;`filter_center`函数用于对激光光条中心位置进行滤波。最终,得到的`center`即为激光光条的中心位置信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芝士汉堡 ིྀིྀ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值