Java在网络通信中应该如何选择合适的序列化框架?

本文探讨了各种序列化框架如JDK、Kryo、ProtoBuffer、Thrift等的优缺点,重点关注它们在性能、跨语言支持和适用场景上的差异,推荐在多语言系统和特定性能需求中选择合适的框架。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

说到网络通信就会牵涉到数据的序列化与反序列化,现如今序列化框架也是层出不穷,比如FST、Kryo、ProtoBuffer、Thrift、Hessian、Avro、MsgPack等等,有的人可能会有疑问,为什么市面上有这么多框架,JDK不是已经有自带的Serializable序列化接口吗?很遗憾地说出这个事实,作为JDK自带地序列化机制,无论是在时间还是空间上的性能不尽人意,但凡时间或者空间上性能优越一点,也不至于让人诟病这么久。所以也就出现了这么多序列化框架,另外即便JDK序列化可以实现,但是无法在跨语言的网络通信中表现出色,除非在多个语言端各自定义好每一个对象,但是这样做无疑效率是最低的,需要提前定义的对象太多了,人力明显不够用。所以也就出现了以ProtoBuffer、Kryo、Thrift等支持跨语言的框架,接下来让我们看下各个框架之间的比较,有比较才能在业务中有更多的选择

序列化框架 通用性
JDK Serializer 只适用于Java
FST 只适用于Java
Kryo 主要适用于Java(可复杂支持多种语言)
Protocol buffer 支持多种语言
Thrift 支持多种语言
Hessian 支持多种语言
Avro 支持多种语言
MsgPack 支持多种语言

性能比较

在这里插入图片描述
在这里插入图片描述

从时间和空间复杂度上来说,kryo的表现是其他序列化框架当中比较好的,序列化之后的大小空间上以及序列化/反序列化时间都不错,但是它没有那么直接不支持跨语言。

接下来我们再来看看针对大小数据序列化的结果,数据的大小也会影响序列化的结果。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分析结果

如果你的系统架构设计中设计到了多语言,那么Proto Buffer和MsgPack,avro将会是个不错的选择,当你的系统是Java时,还可以考虑kryo,它的序列化和反序列化时间相对均衡。

使用示例

    <dependencies>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.42.Final</version>
        </dependency>

        <dependency>
            <groupId>org.msgpack</groupId>
            <artifactId>msgpack</artifactId>
            <version>0.6.12</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.4</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.4</version>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.8</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.49</version>
            <type>jar</type>
            <scope>compile</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcpkix-jdk15on</artifactId>
            <version>1.49</version>
            <type>jar</type>
            <scope>compile</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>de.javakaffee</groupId>
            <artifactId>kryo-serializers</artifactId>
            <version>0.42</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>2.6.1</version>
        </dependency>
    </dependencies>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

coffee_babe

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

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

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

打赏作者

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

抵扣说明:

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

余额充值