找回密码
 立即注册
查看: 183|回复: 0

protobuff和json

[复制链接]
发表于 2022-11-10 09:52 | 显示全部楼层 |阅读模式
protobuff和json广泛应用应用于通信和存储上,2种方式使用那种各有各的特定。protobuff序列化比json快,体积也比json的序列化小 (json耗在属性名,属性越多明显),在性能和内容大小上有要求的选protobuff相对优,但protobuff要定义proto文件,有沟通成本,而且状态也有顺序,修改老版本的proto要遵循一定的规则,而json就比较通用修改也没有那么多规则。
简单的例子对比protobuff和json(fastjson)序列化速度和序列化后的体制大小:
proto文件:
syntax = "proto3";
package com.test1;
option java_package = "com.test1";
option java_multiple_files = true;

message UserInfo{
  string userId   = 1;  //userId
  string url      = 2;  //头像
  string name     = 3;  //名字
  int32 sex       = 4;  //玩家性别
}UserVO:
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

@Data
@Builder
@AllArgsConstructor
public class UserVo {

    private String userId;

    private String url;

    private String name;

    private int sex;
}
Main:
import java.nio.charset.Charset;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializeFilter;
import com.alibaba.fastjson.serializer.SerializerFeature;

import lombok.SneakyThrows;

public class ProtoBuffVsJson {

    @SneakyThrows
    public static void main(String[] args) {
        String uid = "testProtoBuffVsJson";
        String url = "https://www.baidu.com";
        String name = "testProtoBuffVsJson";
        int sex = 1;

        Charset charset = Charset.forName("UTF-8");
        SerializeConfig serializeConfig = SerializeConfig.getGlobalInstance();
        ParserConfig parserConfig = ParserConfig.getGlobalInstance();
        SerializerFeature[] serializerFeatures = new SerializerFeature[]{SerializerFeature.BrowserSecure};;
        SerializeFilter[] serializeFilters = new SerializeFilter[0];;
        Feature[] features = new Feature[0];

        UserVo uservo = UserVo.builder().userId(uid).url(url).name(name).sex(sex).build();
        UserInfo userInfo = UserInfo.newBuilder().setUserId(uid).setUrl(url).setName(name).setSex(sex).build();

        long voEStartTime = System.nanoTime();
        byte[] voBytes = JSON.toJSONBytes(charset, uservo, serializeConfig, serializeFilters, null,
                JSON.DEFAULT_GENERATE_FEATURE, serializerFeatures);
        long voEEndTime = System.nanoTime();

        long protoEStartTime = System.nanoTime();
        byte[] protoBytes = userInfo.toByteArray();
        long protoEEndTime = System.nanoTime();

        long voDStartTime = System.nanoTime();
        uservo = JSON.parseObject(voBytes, charset, UserVo.class, parserConfig, null,
                JSON.DEFAULT_PARSER_FEATURE, features);
        long voDEndTime = System.nanoTime();

        long protoDStartTime = System.nanoTime();
        userInfo = UserInfo.parseFrom(protoBytes);
        long protoDEndTime = System.nanoTime();

        System.out.println("json 序列化时间:" + (voEEndTime - voEStartTime)
                + "ns 反序列化时间:" + (voDEndTime - voDStartTime)
                + "ns byte数组长度:" + voBytes.length);
        System.out.println("proto 序列化时间:" + (protoEEndTime - protoEStartTime)
                + "ns 反序列化时间:" + (protoDEndTime - protoDStartTime)
                + "ns byte数组长度:" + protoBytes.length);

    }
}输出结果:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 21:33 , Processed in 0.092773 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表