protobuf在C#项目中的使用

2023-11-13

protobuf在C#项目中的使用


在C#项目中,有时候会使用到使用到protobuf来作为通信时数据交换的格式。

protobuf(ProtocolBuffer,简称PB),是google 的一种数据交换的格式。这是一种二进制的格式,比使用xml更方便,数据量更小,数据交换速度更快。是一种兼容性比较好的数据传输格式,主要用于通信协议、数据存储等方面。


protobuf的C#版本(protobuf-net)下载地址https://code.google.com/p/protobuf-net/
将其保存为ProtoGen目录
注意:在使用protobuf通信的时候,需要保证其版本号的一致性。

1、制定proto协议
创建一个后缀为“.proto”的文件,即为我们的协议文件。文件格式如下:
示例:TestParam.proto(协议具体规则见附录)
option optimize_for = SPEED;
message TestParam
{
    required string string_param = 1;
    optional double double_param = 2;
    required int32 int_param = 3;
    optional int32 default_param = 4 [default = 1];
    repeated TestParam2 repeated_param = 5;
    ......
}
message Param2
{
    required enum enum_param
    {
        flag_a = 0;
        flag_b = 1;
        flag_c = 2;
    }
    ......
}
......

2、编译 “.proto”文件
TestParam.proto文件复制到ProtoGen目录下,并在此目录下执行命令行语句:
protogen  -i:TestParam.proto  -o:TestParam.cs
则可以由 TestParam.proto得到 TestParam.cs的C#文件

为了方便,可以将该命令保存为一个批处理文件(如csharpPb.bat),使用时修改文件内容并执行此批处理文件即可。

如新的proto文件为 TestParam2.proto,则将 csharpPb.bat内容改为
protogen  -i:TestParam2.proto  -o:TestParam2.cs

3、添加到项目中
将生成的C#文件TestParam.cs复制到C#项目中,并添加对protobuf-net.dll的引用,即可在项目中使用protobuf定义的TestParam结构

附录:proto协议规则
a、协议文件proto一般以“option optimize_for = SPEED;”为开头。
SPEED为文件级别,protobuf定义了3种optimize_for级别:
SPEED:速度优先级别,生成的代码运行效率更高;

CODE_SIZE:大小优先级别,生成的代码编译后所占的空间更少

LIFT_RUNTIME:以牺牲protobuf提供的反射功能为代价,达到生成的代码既执行效率高,编译后所占的空间又少的目的。

注:文件级别缺省状态下默认为SPEED。

b、message是消息定义关键字,等同于class或struct。

c、TestParam、Param2等是消息名,等同于类名或结构体名。

d、required、optional、repeated是限定关键字

required:该字段为必要字段,必须在序列化、反序列化之前赋值(不能为空);

optional:一般字段;

repeated:数组结构字段(主结构中字段repeat_param即为节点是子结构Param2的数组);

一般来说主结构中至少有一个字段为required。

e、默认值

[default = 默认值]

f、数据类型

N:打包的字节不固定

.proto Type Notes C++ Type Java Type
double    double  double
float    float  float
int32 Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.  int32  int
int64 Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.  int64  long
uint32 Uses variable-length encoding.  uint32  int
uint64 Uses variable-length encoding.  uint64  long
sint32 Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.  int32  int
sint64 Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.   int64  long
fixed32 Always four bytes. More efficient than uint32 if values are often greater than 228  uint32  int
fixed64 Always eight bytes. More efficient than uint64 if values are often greater than 256.  uint64  long
sfixed32 Always four bytes.  int32  int
sfixed64 Always eight bytes.  int64  long
bool    bool  boolean
string A string must always contain UTF-8 encoded or 7-bit ASCII text.  string  String
bytes May contain any arbitrary sequence of bytes. string ByteString


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

protobuf在C#项目中的使用 的相关文章

随机推荐

  • C# 基础知识 (一).概念与思想篇

    在C 中有一些我自己认为比较独特的知识点 这些知识点是我经常使用的知识 但对它们的了解还是比较少的 所以通过查找资料学习 总结了这些独特的知识点并简单叙述 第一篇主要是一些概念和思想方面的知识 后面还有C 其他篇的文章 一 C 概念 C 语
  • 计算机网络知识点——第一章

    基本概念 一 计算机网络的概念 计算机网络 是 互连 自治的计算机集合 是将一个分散且具有独立功能的 计算机系统 通过通信设备与线路连接起来 由软件实现资源共享和信息传递的系统 二 计算机网络的功能 1 数据通信 连通性 2 资源共享 硬件
  • servlet多线程的根本原因在于服务器端servlet是单实例的。

    servlet多线程的根本原因在于服务器端servlet是单实例的
  • Real Time Linux简介

    目录 1 Real Time Linux 2 PREEMPT RT 3 Threaded IRQs 中断线程化 4 Xenomai 1 Real Time Linux 标准的Linux内核中不可中断的系统调用 中断屏蔽等因素 都会导致系统在
  • 关于STM32的SPI外设时钟分频对应的SCK速率

    以STM32F103为例 经过system stm32f10x c文件中的SystemInit 函数之后 这里是指的默认时钟配置如下图所示 STM32F103的系统框架图如下所示 可见 SPI1是在挂APB2上的 SPI2是挂在APB1上的
  • 复杂事件处理技术调研

    文章目录 1 什么是复杂事件处理 2 复杂事件处理引擎 2 1 简介 1 什么是复杂事件处理 https blog csdn net zhangzhengming article details 5708908 2 复杂事件处理引擎 2 1
  • 解决vs2015update3无法更新的问题

    解决方法很简单 直接去微软官方网站下载社区版 免费 网上其他地方的都是有问题的 官方网站下载下来是7个G 而其他地方下载是3个G 还缺少很多东西 链接https my visualstudio com Downloads q visual
  • iOS 开发之动力效果

    iOS 开发之动力效果 UIDynamic是从iOS 7开始引入的一种新技术属于UIKit框架可以模拟现实生活中的物理现象如碰撞抖动摆动等 1 动力效果会把上一个效果移除 2 动力效果也可以叠加多个效果 使用 UIDynamic步骤 1 创
  • html+css+js用户注册页面简

    1 开发一个用户注册界面 要求 年龄需用 JavaScript 检查格式是否正确 Reg html
  • 【机器学习】拉格朗日对偶性

    有任何的书写错误 排版错误 概念错误等 希望大家包含指正 拉格朗日对偶性 在求解最优化问题中 拉格朗日乘数法 Lagrange Multiplier 和 KKT Karush Kuhn Tucker 三个人名 条件是两种最常用的方法 在有等
  • 方法、类和对象

    方法 类和对象 方法 类似于其它语言的函数 类 类是一个模板 它描述一类对象的行为和状态 对象 对象是类的一个实例 有状态和行为 方法 方法的基础用法 方法声明格式 修饰符1 修饰符2 返回值类型 方法名 形式参数列表 Java语句 方法的
  • pyqt 槽任意参数_pyqt中信号与槽的参数传递。

    摘自 http www cnblogs com caomingongli archive 2011 09 19 2180904 html pyqt中信号与槽的参数传递 当信号与槽函数的参数数量相同时 它们参数类型要完全一致 信号与槽不能有缺
  • MatLab 求平均值,方差,标准差

    文章目录 概述 1 计算一个数组的平均值 2 计算一个数组的方差 3 计算一个数组的标准差 概述 MatLab在科学计算中 具有很强大的功能 常用的计算方法是计算一组数据的平均数 标准差 方差 1 计算一个数组的平均值 使用 mean 函数
  • [leetcode] 2024. 考试的最大困扰度

    题目链接 题意 给出只含有两种字符的字符串以及一个次数限制k 问最多修改k个位置 T gt F F gt T 最大的连续的字符串的长度是多少 思路 双指针 滑动窗口 假如说我们要找修改后连续的T最长的长度 我们可以 枚举右端点 并统计当前不
  • 【深度学习】关于EMA:指数移动平均

    什么是EMA 指数移动平均 exponential moving average 也叫做权重移动平均 weighted moving average 可以用来估计变量的局部均值 使得变量的更新与一段时间内的历史取值有关 在采用 SGD 或者
  • Oracle11g补丁安装(单实例)

    Oracle11g补丁安装 单实例 一 安装环境及补丁版本 Oracle版本 11 2 0 4 Linux版本 Red Hat Enterprise Linux Server release 6 4 Santiago PSU版本号 p317
  • Git 安装和环境部署

    1 下载Git 进入Git的GitHub项目release下载 进入国内镜像源下载 镜像地址 2 安装Git 跟随安装引导进行安装 选择各项 如没有特殊需求 大多数选项一直next即可 3 设置name和email
  • Docker login 命令-Docker login 作用-Docker login 默认用户名和密码-Docker登录-嗨客网

    docker login命令教程 docker login 命令用于登陆到一个 Docker 镜像仓库 如果未指定镜像仓库地址 默认为官方仓库 Docker Hub 如果用户使用 docker login 命令登录官方仓库 首先我们需要在官
  • 服务器管理系统是什么

    服务器管理系统是什么 服务器管理系统 是在操作系统下对操作系统的服务器软件及其相关软件进行二次设置的管理软件 是运营商管理域名 服务器 企业邮局 数据库等服务器主机类产品的一个网站平台 以达到快捷实现域名 服务器主机 企业邮局 数据库等产品
  • protobuf在C#项目中的使用

    protobuf在C 项目中的使用 在C 项目中 有时候会使用到使用到protobuf来作为通信时数据交换的格式 protobuf ProtocolBuffer 简称PB 是google 的一种数据交换的格式 这是一种二进制的格式 比使用x