V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
haosamax
V2EX  ›  Java

[binary protocol | text protocol] 大家都采用什么序列化方式,自定义还是现成的轮子?

  •  
  •   haosamax · 2021-01-08 10:02:14 +08:00 · 2946 次点击
    这是一个创建于 1422 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在看《设计数据密集型应用》,看到编码部分,又想到框架中的自定义编码,有所想: 框架自定义的序列化方式很难用(字段值编码后拼接,无需编码名称),每次处理循环体都要手动处理操作字节,而且前后兼容,想问下大伙:1 、为什么搜索结果都说 binary protocol 比 textprotocol 快; 2 、项目用的 protocol 是? 3 、有没有一种可读性高并且速度快的编码方式?

    22 条回复    2021-01-12 15:06:19 +08:00
    oott123
        1
    oott123  
       2021-01-08 10:32:26 +08:00 via Android
    overhead 低信息密度高自然就快,本前端表示除了 json 和 msgpack 别的都不用(
    chendy
        2
    chendy  
       2021-01-08 10:40:04 +08:00
    1. 二进制少一轮字符串解码编码,表示数字和布尔用的字节更少,不考虑人类阅读可以用更紧凑的格式,代价就是直接拿给人类看基本看不懂
    2. binary 只想到 protobuf,text 只想到 json
    3. json 也不慢
    togou
        3
    togou  
       2021-01-08 12:11:04 +08:00
    解析二进制比 字符串各种查找 配对肯定快 xml json 肯定比不过 pb tars 这种二进制协议啊
    PureWhiteWu
        4
    PureWhiteWu  
       2021-01-08 12:11:28 +08:00
    binary
    haosamax
        5
    haosamax  
    OP
       2021-01-08 12:20:34 +08:00 via iPhone
    各位说的是,为社么快这块理解了
    liian2019
        6
    liian2019  
       2021-01-08 14:04:58 +08:00
    json 和 protobuf
    MeteorCat
        7
    MeteorCat  
       2021-01-08 14:28:00 +08:00 via Android
    json 主要是冗余太多了,还套个 http 协议,但是可视化很方便,基本上有个 web 浏览器就能调试
    haosamax
        8
    haosamax  
    OP
       2021-01-08 14:29:41 +08:00
    @liian2019 那如果更换为 protobuf,有没有 JavaBean 生成.proto 的工具
    icyalala
        9
    icyalala  
       2021-01-08 14:35:06 +08:00
    protobuf 有强类型这个 json 比不了,但是单看性能,不一定比 json + gzip + simdjson 快到哪里去,而且 pb 还会生成一大坨代码出来难用的要死。但凡想要点可读性那选 json 没错。
    chenqh
        10
    chenqh  
       2021-01-08 14:37:04 +08:00
    json 太好调试了呀,二进制的东西调试成本比 json 高太多了
    liian2019
        11
    liian2019  
       2021-01-08 17:55:50 +08:00
    @haosamax 一般都是 protobuf 转 java
    xiangbohua
        12
    xiangbohua  
       2021-01-08 19:38:28 +08:00
    没什么特别需求无脑 json,或者 xml 啊,搞协议的搞搞 protobuf 啥的吧。
    xiangbohua
        13
    xiangbohua  
       2021-01-08 20:00:46 +08:00
    哎,参加工作的第一年,一个做虚拟化的公司,用的 Protobuf 当时烧了不少脑细胞
    12101111
        14
    12101111  
       2021-01-08 21:30:06 +08:00
    但是现在 json 的序列化用上 SIMD 之后速度惊人, 实际上也是按照二进制的方式解析的, 只不过按弱类型操作 json 容易有 bug
    nthhdy
        15
    nthhdy  
       2021-01-08 22:33:44 +08:00
    binary 是快,但基本上就意味着可读性低,一般必须得用工具才能看。对性能要求不高时,json 很好用,可读性好,编码本身的扩展性也好,改字段、类型很容易。
    haosamax
        16
    haosamax  
    OP
       2021-01-09 09:44:52 +08:00 via iPhone
    @xiangbohua 内部系统 socket 通讯,自定义的协议用着有点 egg pain
    haosamax
        17
    haosamax  
    OP
       2021-01-09 09:46:19 +08:00 via iPhone
    @liian2019 是的。如果迁移的话岂不是都得写一遍 proto 文件
    daimiaopeng
        18
    daimiaopeng  
       2021-01-09 16:56:25 +08:00
    要看应用场景是什么,要是对流量要需求比较高的话,比如说网络游戏,那肯定用偏二进制方面的编码
    liian2019
        19
    liian2019  
       2021-01-11 09:58:41 +08:00
    @haosamax 这个没有接触过,可以 google 看看有没有什么好的解决方案。一般协议应该也不会太多吧
    onepix
        20
    onepix  
       2021-01-11 17:29:01 +08:00
    textprotocol 可以理解成是在 string 的通用的 binary protocol 基础上又封装了一层,我们平时说的使用 UTF8 还是 GB2312 就是这个 string 的 binary protocol 的实现,所以 textprotocol 会慢一拍啊
    haosamax
        21
    haosamax  
    OP
       2021-01-11 18:27:12 +08:00 via iPhone
    @onepix 理解了
    SkyLine7
        22
    SkyLine7  
       2021-01-12 15:06:19 +08:00
    json
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2652 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:21 · PVG 18:21 · LAX 02:21 · JFK 05:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.