Skip to content
/ Packable Public
forked from BillyWei01/Packable

Packable is an effective data interchange format.

License

Notifications You must be signed in to change notification settings

Mu-L/Packable

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Packbele

Maven Central | English

1. 概述

Packable是一个高效易用的序列化框架。
可以用于对象序列化/反序列化,消息封装等,从而方便本地存储或网络传输。

Packable有以下优点:

  • 1、编码/解码快速。
  • 2、编码紧凑,体积小。
  • 3、支持版本兼容(增删字段不影响整体的解析)。
  • 4、代码轻量(Java版本仅20+K)。
  • 5、支持多种类型。
  • 6、支持多种语言,可跨平台传输。

Packable目前实现了Java、C++、C#、Objective-C、Go等版本。

2. 使用方法

以下以JAVA平台的用法举例。

Java代码已发布到Maven仓库,路径如下:

dependencies {
    implementation 'io.github.billywei01:packable:2.0.1'
}

2.1 常规用法

假设类型定义如下:

public class Person {
    public String name;
    public int age;

    public Person(String name, int age){
        this.name = name;
        this.age = age;
    }
}

使用前,可以定义解码方法如下:

public static final Packer<Person> PERSON_PACKER = new Packer<Person>() {
    // 打包目标对象到encoder
    @Override
    public void pack(PackEncoder encoder, Person target) {
        // 0, 1等编号,类似json的key, 用于标记字段。
        encoder.putString(0, target.name)
                .putInt(1, target.age);
    }

    // 从decoder解包目标对象
    @Override
    public Person unpack(PackDecoder decoder) {
        // 根据编号取出对应的字段
        return new Person(
                decoder.getString(0),
                decoder.getInt(1)
        );
    }
};

解码对象:

public void test() {
    Person person = new Person("Tom", 20);
    
    // 序列化
    byte[] encoded = PackEncoder.encode(person, PERSON_PACKER);
    
    // 反序列化
    Person decoded = PackDecoder.decode(encoded, PERSON_PACKER);
}

解码列表:

public void test4() {
    List<Person> personList = new ArrayList<>();
    personList.add(new Person("Tom", 20));
    personList.add(new Person("Jerry", 19));

    // 序列化
    byte[] encoded = PackEncoder.encodeList(personList, PERSON_PACKER);
    
    // 反序列化
    List<Person> decoded = PackDecoder.decodeList(encoded, PERSON_PACKER);
}

2.2 直接编码

上面的举例只是范例之一,具体使用过程中,可以灵活运用。
比如,可以直接编解码

public void test2() {
    String message = "hello";
    int a = 100;
    int b = 200;

    PackEncoder encoder = new PackEncoder();
    encoder.putString(0, message)
            .putInt(1, a)
            .putInt(2, b);
    byte[] bytes = encoder.toBytes();

    PackDecoder decoder = new PackDecoder(bytes);
    String decodeMessage = decoder.getString(0);
    int decodedA = decoder.getInt(1);
    int decodedB = decoder.getInt(2);
}

3. 性能测试

除了protobuf之外,还选择了gson (json协议的序列化框架之一,java平台)来做下比较。

空间方面,序列化后数据大小:

数据大小(byte)
packable 2564756 (56%)
protobuf 2627081 (59%)
gson 4427344 (100%)

packable和protobuf大小相近(packable略小),约为gson的57%。

耗时方面,分别在PC和手机上测试了两组数据:

  1. Macbook Pro
序列化耗时 (ms) 反序列化耗时(ms)
packable 8 8
protobuf 16 17
gson 58 50

4. 关联文档

https://juejin.cn/post/6992380683977130015/

License

See the LICENSE file for license rights and limitations.

About

Packable is an effective data interchange format.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Kotlin 29.9%
  • Java 17.5%
  • C# 17.3%
  • C++ 14.1%
  • Objective-C 11.2%
  • Go 9.5%
  • Other 0.5%