zoukankan      html  css  js  c++  java
  • 高性能序列化与反序列化

      目前有很多通用的序列化实现,比如java和go都内置了序列化实现,还有一些开源的序列化框架,比如Google 的 Protobuf、Kryo、Hessian 等,

    以及像json,二进制这种标准会的数据格式也可以作为序列化的实现。

      首先我们选用数列化实现有哪几个维度呢?

    1. 序列化后数据要有良好的可读性
    2. 实现的复杂度较低
    3. 性能比较好,序列化和反序列化的速度较快
    4. 信息密度较大,就是说同样的结构化数据,序列化后所占的空间越小越好。

      当然,不会存在一种序列化实现在这四个方面都是最优的,否则我们就没必要来纠结到底选择哪种实现了。因为,大多数情况下,易于阅读和信息密度是矛盾的,实现的复杂度和性能也是互相矛盾的。所以,我们需要根据所实现的业务,来选择合适的序列化实现。

      像 JSON、XML 这些序列化方法,可读性最好,但信息密度也最低。像 Kryo、Hessian 这些通用的二进制序列化实现,适用范围广,使用简单,性能比 JSON、XML 要好一些,但是肯定不如专用的序列化实现。

      专用化的序列化不需要考虑通用性,比如,我们可以固定字段的顺序,这样在序列化后的字节里面就不必包含字段名,只要字段值就可以了,不同类型的数据也可以做针对性的优化,

    从而达到提高性能,增加信息密度的目的。

      举例来说使用专用的序列化方法:

      要序列化的User对象

        

    user:
      name: "zhangsan"
      age: 23
      married: true

      我们可以将其序列化这样:

    03   | 08 7a 68 61 6e 67 73 61 6e | 17 | 01
    User |    z  h  a  n  g  s  a  n  | 23 | true

    第一段 :03 代表User对象

    第二段:由于name的长度是不固定的所以用第一个字节来代表name的长度,后面的8个字节则代表name的数据

    第三段:是年龄,我们直接用一个字节表示就可以了,23 的 16 进制是 17 。

    最后一个段是婚姻状态,我们用一个字节来表示,01 表示已婚,00 表示未婚,这里面保存一个 01。

      总体来说,大多数情况下,选择一个高性能的通用序列化框架都可以满足要求,在性能可以满足需求的前提下,推荐优先选择 JSON 这种可读性好的序列化方法。

  • 相关阅读:
    Pytest权威教程21-API参考-02-标记(Marks)
    GitLab获取人员参与项目-贡献项目列表
    通过Confulence API统计用户文档贡献量
    Git项目代码统计-Python3版gitstats
    Pytest从测试类外为测试用例动态注入数据
    Python操作Jira
    Selenium操作Chrome模拟手机浏览器
    剑指offer 构建乘积数组
    栈与堆 && char*, char[], char**, char*[], char[][]详解
    vector 容器知识点汇总
  • 原文地址:https://www.cnblogs.com/volare/p/12297018.html
Copyright © 2011-2022 走看看