protobuf 简介

Protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言。
支持多种编程语言,现:Java、c#、c++、Go 和 Python。
基于二进制,因此比传统的XML表示高效短小得多 。

protobuf 应用场景

作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
个人认为,主要用于数据交互和共享,此种情况需要双方制定一个特定的数据结构,那么使用ProtoBuf定义一个数据结构,然后大家从这个描述文件,各自生成自己使用的编程语言对应的代码文件,再使用这些代码对双方的数据进行处理。那么,只要都遵守这个数据文件格式,数据共享就可以实现夸平台。如果数据描述文件做了修改,只要遵守一定的规则,那么原有数据还是可以兼容使用的。这个就是做了一个平台无关的文件与平台和语言相关的数据对象之间的适配转化工作,就和很多xml解析器一样。

protobuf-net版

源代码下载地址:https://github.com/mgravell/protobuf-net
开源项目地址如下:https://code.google.com/p/protobuf-net/

proto文件格式

package对应于c#中的命名空间
required对应类的属性
optional创建一个具有默认值的属性,通过 [default=XXX]设置默认值,不添加默认为空置。如string默认为“”,int默认为0
enum创建枚举
message创建自定义类或内部类
repeated对应list列表数据

proto数据类型

.proto类型 Java 类型 C++类型 备注
double double double
float float float
int32 int int32 使用可变长编码方式。编码负数时不够高效——如果你的字段可能含有负数,那么请使用sint32。
int64 long int64 使用可变长编码方式。编码负数时不够高效——如果你的字段可能含有负数,那么请使用sint64。
uint32 int[1] uint32 Uses variable-length encoding.
uint64 long[1] uint64 Uses variable-length encoding.
sint32 int int32 使用可变长编码方式。有符号的整型值。编码时比通常的int32高效。
sint64 long int64 使用可变长编码方式。有符号的整型值。编码时比通常的int64高效。
fixed32 int[1] uint32 总是4个字节。如果数值总是比总是比228大的话,这个类型会比uint32高效。
fixed64 long[1] uint64 总是8个字节。如果数值总是比总是比256大的话,这个类型会比uint64高效。
sfixed32 int int32 总是4个字节。
sfixed64 long int64 总是8个字节。
bool boolean bool
string String string 一个字符串必须是UTF-8编码或者7-bit ASCII编码的文本。
bytes ByteString string 可能包含任意顺序的字节数据。

示例

package test;
message Person {required string name=1;required int32 id=2;optional string email=3 ;enum PhoneType {MOBILE=0;HOME=1;WORK=2;}message PhoneNumber {required string number=1;optional PhoneType type=2 [default=HOME];}repeated PhoneNumber phone=4;
}

通过.proto文件导出C#支持的.cs类文件

下载导出工具 ProtoGen.exe 下载地址: http://pan.baidu.com/s/1eRIv3oe


把要转的.proto文件放到该目录中

通过cmd命令行进入到该目录
使用如下命令行导出.cs文件

protogen.exe  -i:Person.proto    -o:Person.cs

命令解释
protogen -i:test.proto -o:test.cs -ns:UGE.Metadata -p:import=UGE
这句话的意思是, 输入test.proto文件, 给我生成 test.cs 文件, 代码在 namespace UGE.Metadata里, 顺便引用下 using UGE.

proto文件编辑的命令

protogen -i:input.proto -o:output.cs
protogen -i:input.proto -o:output.xml -t:xml
protogen -i:input.proto -o:output.cs -p:datacontract -q
protogen -i:input.proto -o:output.cs -p:observable=true

proto转化后的.cs文件的序列化和反序列化

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ProtoBuf;
using input.test;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace test1
{class Program{static void Main(string[] args){Person p = new Person();p.name = "zhang san";p.email = "XXXXX@qq.com";p.id = 12;//序列化操作MemoryStream ms=new MemoryStream();//BinaryFormatter bm = new BinaryFormatter();//bm.Serialize(ms, p);Serializer.Serialize<Person>(ms, p);byte[] data = ms.ToArray();//length=27  709//反序列化操作MemoryStream ms1 = new MemoryStream(data);// BinaryFormatter bm1 = new BinaryFormatter();//Person p1= bm.Deserialize(ms1) as Person;Person p1 = Serializer.Deserialize<Person>(ms1);Console.ReadKey();}}
}

遇到的问题

如果生成的时候提示找不到google/protobuf/descriptor.proto
要下载protobuf-csharp-port-master
https://code.google.com/archive/p/protobuf-net/downloads
并把google目录放到你自己的.proto文件的同级目录中

关于protobuf (protobuf-net版)相关推荐

  1. ndk编译protobuf精简版(lite版)

    得到的结果是protobuf的完整版,由于小弟用的protobuf的版本是2.4.1,那么问题就出现了 ptorobuf2.4.1支持的Android系统版本至少为2.3(2.3以下启动时黑屏,一直黑 ...

  2. unity项目源码_在Unity中使用protobuf

    Protocol Buffers (通常简称为protobuf) 是Google开发的一种格式,这种格式与开发语言无关.与运行平台无关,用于序列化结构数据,并且很容易扩展.这种格式可以用于通信协议.数 ...

  3. gRPC基础--Protobuf编码格式详解

    什么是 Protobuf Protobuf是Protocol Buffers的简称,它是Google公司开发的一种数据描述语言,用于描述一种轻便高效的结构化数据存储格式,并于2008年对外开源.Pro ...

  4. Protobuf语言指南

    什么是 Protobuf Protobuf是Protocol Buffers的简称,它是Google公司开发的一种数据描述语言,用于描述一种轻便高效的结构化数据存储格式,并于2008年对外开源.Pro ...

  5. Google Protobuf 实践使用开发

    Android 敏捷开发助手 Lottie动画 轻松使用 PNG.JPG等普通图片高保真转SVG图 Android 完美的蒙层方案 Android MMKV框架引入使用 强大无匹的自定义下拉列表 Go ...

  6. Go protobuf

    使用protobuf实现节点间通信.编码报文以提高传输效率 protobuf全程Protocol Buffers,是Google开发的一种数据描述语言. protobuf是一种轻便高效的结构化数据存储 ...

  7. ProtoBuf详解(一)概念和语法

    关于ProtoBuf ProtoBuf 是谷歌开源的一套与语言无关,平台无关,可扩展性强,兼容性好并且效率很高的数据序列化方法,非常适合用于做二进制数据的通信协议和数据存储.这里可以访问官方文档. 很 ...

  8. 在网络通讯中应用Protobuf

    Protobuf的设计非常适用于在网络通讯中的数据载体,它序列化出来的数据量少再加上以K-V的方式来存储数据,对消息的版本兼容性非常强:还有一个比较大的优点就是有着很多的语言平台支持.下面讲解一下如何 ...

  9. 深入理解 ProtoBuf 原理与工程实践(概述)

    ProtoBuf 作为一种跨平台.语言无关.可扩展的序列化结构数据的方法,已广泛应用于网络数据交换及存储.随着互联网的发展,系统的异构性会愈发突出,跨语言的需求会愈加明显,同时 gRPC 也大有取代R ...

  10. protobuf与protoc-gen-go

    from: https://studygolang.com/articles/12673?fr=sidebar 什么是protobuf Protobuf(Protocol Buffer)是google ...

最新文章

  1. 简单介绍Windows中将Nginx添加为服务的问题
  2. 给一个表单提交绑定一个点击事件
  3. java web应用解决乱码问题
  4. MyBatis开发重点知识
  5. 从壹开始前后端分离 40 || 完美基于AOP的接口性能分析
  6. 零基础自学python的建议-关于零基础学习 Python 有什么好的建议?
  7. 斯坦福《编程方法学》 笔记与资源
  8. php7安装kafka扩展(已经测试)
  9. postgresql修炼之道_PostgreSQL内核开发学习资料
  10. rust为什么显示不了国服_捋捋 Rust 中的 impl Trait 和 dyn Trait
  11. HAProxy杂记(1)
  12. jxl读数据库数据生成xls 并下载
  13. Cairo-Dock 系统关机无效
  14. mysql 5.7.26 linux安装_mysql-5.7.28 在Linux下的安装教程图解
  15. Mysql-slowlog
  16. try with resource 的使用
  17. BUUCTF中的reverse2
  18. [滴滴校招] 连续最大和
  19. 一键同步Elasticsearch,DataWorks数据集成同步解决方案上线!
  20. 分析测试电视遥控总结

热门文章

  1. LitJson输出格式化Json字符串
  2. 数字孪生教程大全之 我们如何构建数字孪生?数字孪生的五个级别都是什么
  3. 谷歌公布13GB 3D扫描数据集:17大类、1030个家用物品
  4. vue将页面html导出为pdf
  5. 安装Kong和Konga
  6. 1小时、1天、1个月、一年的时间戳
  7. ubuntu返回图形界面_Ubuntu设置命令行界面和图形界面切换方法
  8. 3D点云处理:点云聚类--FEC: Fast Euclidean Clustering for Point Cloud Segmentation
  9. python删除一列数据_python删除txt第一列数据库
  10. PHP的strtotime()