java : http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html
protobuf 简介:是一种序列化与结构化数据的一种机制,具有跨平台、解析速度快、序列化数据体积小、扩展性高、使用简单的特点
目标:验证protobuf序列化的内存占用量低于Java的直接序列化
java的实现:
public static void serialize(Serializable obj, OutputStream outputStream) { if (outputStream == null) { throw new IllegalArgumentException("The OutputStream must not be null"); } ObjectOutputStream out = null; try { // stream closed in the finally out = new ObjectOutputStream(outputStream); out.writeObject(obj); } catch (IOException ex) { throw new SerializationException(ex); } finally { try { if (out != null) { out.close(); } } catch (IOException ex) { // ignore close exception } } } public static byte[] serialize(Serializable obj) { ByteArrayOutputStream baos = new ByteArrayOutputStream(512); serialize(obj, baos); return baos.toByteArray(); }
protoBuf的实现:
需要先定义 User.proto 文件,然后通过protoc.exe 进行代码生成
D:\master\tts_search\serializer\src\proto>protoc.exe --java_out=. User.proto
User.proto的定义如下:
option java_package = "com.ddd.fff.tts.search.serializer.proto"; option java_outer_classname = "UserProto"; message User { required string username = 1; optional string password = 2; repeated User friendList = 3; }
测试代码:
package test.ddd.serializer; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.SerializationUtils; import com.google.common.io.Files; import com.ddd.fff.tts.search.serializer.proto.UserProto; public class TestSerialization2 { public static void main(String[] args) throws Exception { testJava(); testProto(); } private static void testProto() throws Exception { UserProto.User.Builder me = UserProto.User.newBuilder(); me.setUsername("xinchun.wang"); me.setPassword("123456"); for(int i =0;i<100000;i++){ UserProto.User.Builder she = UserProto.User.newBuilder(); she.setPassword("pass"+i); she.setUsername("name"+i); me.addFriendList(she); } UserProto.User user = me.build(); ByteArrayOutputStream output = new ByteArrayOutputStream(); user.writeTo(output); // -------------- 分割线:上面是发送方,将数据序列化后发送 --------------- byte[] byteArray = output.toByteArray(); System.out.println(byteArray.length); ByteArrayInputStream input = new ByteArrayInputStream(byteArray); // 反序列化 UserProto.User xxg2 = UserProto.User.parseFrom(input); System.out.println(xxg2); } private static void testJava() throws Exception { User me = new User(); me.setPassword("123456"); me.setUsername("xinchun.wang"); for (int i = 0; i < 100000; i++) { User she = new User(); she.setPassword("pass"+i); she.setUsername("name"+i); me.getFriendList().add(she); } System.out.println(SerializationUtils.serialize(me).length); Files.write(SerializationUtils.serialize(me), new File("data")); } public static class User implements Serializable{ private static final long serialVersionUID = 1L; private String username; private String password; private List<User> friendList = new ArrayList<User>(); public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public List<User> getFriendList() { return friendList; } public void setFriendList(List<User> friendList) { this.friendList = friendList; } } }
输出:
java:4678004,约4M
proto:2377802,约2M
可见在有缓存的地方,还是用protoBuf可以节约不少内存空间的。
相关推荐
Kafka-protobuf-serde 分支 特拉维斯CI CodeFactor 编纂 更好的代码中心 连体服 掌握 开发 Kafka的序列化器/反序列化器,用于对协议缓冲区消息进行序列化/反序列化 要求 相依性 版本 卡夫卡 2.XX 原虫 3.XX ...
**rust-protobuf:Google协议缓冲区的Rust实现** 在软件开发中,数据序列化是一种将结构化的数据转换为字节流,以便于存储、传输和解析的技术。Google的Protocol Buffers(简称protobuf)就是一种高效的数据序列化...
spring-boot-protobuf序列化 此仓库中的项目 spring-boot-serializations-producer:负责产生的Protobuf和json编码的数据。 默认情况下,该项目从端口8080开始,并公开2个终结点:一个公开JSON,一个公开Protobuf。 ...
protobuf-cpp-3.8.0.tar.gz是一个包含Google Protocol Buffers(简称protobuf)C++版本的源码压缩包,版本号为3.8.0。protobuf是一种高效、灵活且可扩展的数据序列化协议,广泛应用于分布式系统中的数据交换。它是...
Kotlin cross-platform / multi-format ...Supports JSON, CBOR, and Protobuf formats out-of-the-box. The same code works on Kotlin/JVM, Kotlin/JS and Kotlin/Native Runtime overview This project contai
榆树 实验性的protobuf插件生成elm代码,以根据proto定义对进行解码/编码。 该插件本身是用Go编写的,它需要在系统上安装基本protoc protobuf编译器。 有关生成的示例输出文件,请参见 。支持的功能 double / float...
比较了以下格式和库: 协议缓冲区: protobuf-js , pbf , protons , google-protobuf Avro: avsc BSON: bson BSER: bser JSBinary: js-binary 根据本文当前的基准测试结果,作者将按以下顺序对顶级库进行...
protobuf,全称Protocol Buffers,是Google开发的一种数据序列化协议,用于高效地存储和传输结构化数据。它提供了一种语言无关、平台无关、高效且自动化的数据序列化方式,广泛应用于网络通信、数据库存储、配置文件...
二进制固定长度序列化 二进制固定长度(BFL)序列化格式。 二进制固定长度协议专用于为特定数据类型提供固定... 该协议不像Protobuf那样进行可变长度编码,因此,相同类型的所有变量都具有相同的长度。 如果class的
用纯锈写的生成锈码具有用于生成代码的运行时库 (Coded{Input|Output}Stream impl)支持 Protobuf 版本 2 和 3板条箱清单rust-protobuf — 存储库提供多个板条箱:protobuf — protobuf 运行时protobuf-codegen — ...
在Elixir生态系统中,`protobuf-elixir`是Google Protobuf的一个纯Elixir实现,它允许开发者在Elixir项目中利用Protobuf的强大功能。这个库使得Elixir程序员能够轻松地处理由其他语言(如Java、Python或C++)生成的...
Hive并不内置支持Protobuf,但可以通过第三方库如`protobuf-hive`实现。 2. **protobuf-hive库**:这是一个开源项目,提供了对Hive的Protobuf支持。它包含了一个自定义SerDe,允许Hive查询直接操作Protobuf序列化的...
4. **Serialization**:将结构化的数据转换成二进制格式的过程,便于在网络传输或存储时使用。 5. **Deserialization**:将二进制数据转换回结构化数据的过程,使程序可以读取和处理这些数据。 **Protobuf的工作...
占位符README,直到... 执行Protobuf: protoc.exe \ --java_out=src/main/java \ src/main/resources/protobuf/AwesomePowerUp.proto运行应用程序: mvn spring-boot:run查询/awesome端点并感到被授权: > curl -i ...
Int和List<Int> Long List<Long> Boolean和List<Boolean> String和List<String> Serializable ¹ ¹ satchel-serializer-protobuf-lite不支持 设置将JitPack存储库添加到您的项目级别build.gradle : all
C#中的`System.Runtime.Serialization.Formatters.Binary.BinaryFormatter`类提供了一种默认的序列化方式,它将对象的状态转换为字节流。这种序列化方式简单易用,但生成的序列化数据通常较大,且不便于跨平台传输。...
要安装protobuf,您需要为所选的编程语言安装协议编译器(用于编译.proto文件)和protobuf运行时。 协议编译器安装 协议编译器是用C ++编写的。 如果您使用的是C ++,请按照《 安装protoc和C ++运行时。 对于非C +...
一、JSON序列化(Serialization) 序列化是指将对象的状态转换为可以存储或传输的格式。在Objective-C中,苹果提供了`NSJSONSerialization`类来处理JSON序列化。以下是如何将实体类对象转换为JSON字符串的步骤: 1...
protobuf-nim是一个专门为Nim编程语言设计的Protocol Buffers(Protobuf)库,它提供了一种在Nim中处理和序列化数据的方式,无需依赖任何外部工具。Protocol Buffers是Google开发的一种数据序列化协议,它允许开发者...
开源项目"alecthomas-go_serialization_benchmarks"是一个针对Go语言中各种序列化方法性能进行基准测试的项目。在Go语言中,序列化是将数据结构转化为可存储或传输格式的过程,通常用于数据持久化、网络通信或者跨...