gpt4 book ai didi

java - Google protobuf 格式如何在编码后减小对象的大小

转载 作者:行者123 更新时间:2023-11-30 02:51:27 33 4
gpt4 key购买 nike

package sample;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.SerializationUtils;

import sample.ProtoObj.Attachment;

public class Main {

public static void main(String args[]){
POJO pojo = new POJO();
pojo.setContent("content");
List<sample.POJO.Attachment> att = new ArrayList<POJO.Attachment>();
sample.POJO.Attachment attach = pojo.new Attachment();
attach.setName("Attachment Name");
attach.setId("0e068652dbd9");
attach.setSize(1913558);
att.add(attach);
pojo.setAttach(att);
byte[] byyy = SerializationUtils.serialize(pojo);
System.out.println("Size of the POJO ::: "+byyy.length);

ProtoObj tc = new ProtoObj();
List<Attachment> attachList = new ArrayList<ProtoObj.Attachment>();
Attachment attach1 = tc.new Attachment();
attach1.setName("Attachment Name");
attach1.setId("0e068652dbd9");
attach1.setSize(1913558);
attachList.add(attach1);
tc.setContent("content");
tc.setAttach(attachList);

byte[] bhh = tc.getProto(tc);

System.out.println("Size of the PROTO ::: "+bhh.length);

}

}

我已经使用上面的程序使用 Protobuf 和 POJO 来计算编码/序列化对象的大小。这两个对象处理同一组数据。但输出显示对象的大小存在巨大差异。

输出:

Size of the POJO ::: 336
Size of the PROTO ::: 82

我还阅读了以下链接,了解 google protobuf 格式如何影响编码对象的大小。

https://developers.google.com/protocol-buffers/docs/encoding

但是我无法理解。请解释一下,让我简单理解。

最佳答案

Protobuf 不会将架构与数据一起发送。因此双方都需要有模式才能反序列化传递的数据。

因此,您可以优化并将每个字段放在另一个字段之后。像这样的事情:

AttachmentName0e068652dbd91913558

所有这些都是二进制格式的。 JSON 中的内容如下所示:

{"name": "AttachmentName", "id": "0e068652dbd9", "size": "1913558"}

正如您所看到的,架构被编码在序列化消息本身中。

我并不完全了解 Java SerializationUtils,但我认为它们也会传递或编码模式,这就是您看到这种大小差异的原因。

关于java - Google protobuf 格式如何在编码后减小对象的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38525566/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com