2016-07-22 3 views
1
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. Оба объекта обрабатывают один и тот же набор данных. Но результат показывает резкую разницу в размере объекта.Как формат protobuf Google уменьшает размер объекта после его кодирования

Выход:

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

Кроме того, я прочитал ссылку ниже, чтобы узнать, как Google Protobuf форматы влияют на размер кодируемого объекта.

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

Но я не могу понять. Пожалуйста, объясните мне, чтобы понять просто.

ответ

2

Protobuf не отправляет схему вместе с данными. Поэтому обе стороны должны иметь схему для десериализации переданных данных.

Из-за этого вы можете оптимизировать и поместить каждое поле прямо за другим. Что-то вроде этого:

AttachmentName0e068652dbd91913558

И все это в двоичном формате. Это в JSON будет выглядеть следующим образом:

{ "имя": "AttachmentName", "ID": "0e068652dbd9", "размер": "1913558"}

Как вы можете видеть схему кодируется в самом сериализованном сообщении.

Я не полностью осведомлен о Java SerialisationUtils, но я думаю, что они передают или кодируют схему также, и именно поэтому вы видите разницу в размере.

+0

Спасибо за объяснение. Без схемы (я считаю, что она представляет имя переменной, например name, id), как они будут дифференцировать значение при де-сериализации. – Roshan

+0

Как я уже сказал, обеим сторонам нужна схема - при сериализации я использую схему для сериализации, а когда кто-то еще десериализуется, ему нужно иметь ту же схему для десериализации. Это просто факт, что обе стороны имеют схему заранее и не получают ее с самими данными. –

+0

. Еще одно сомнение в том, что добавление новой схемы не повлияет на старый закодированный объект, поскольку нам нужно поддерживать уникальный номер в определении прото. Я прав? – Roshan

Смежные вопросы