一、什么是ProtoBuf

protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。它是一种类似于xml、json等类似作用的交互格式。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。

google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。

作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

随着移动市场的异军突起以及它自身的优点,PB最为一种数据交换格式彻底火了。

二、ProtoBuf的版本

PB具有三个版本:

  一、Google官方版本:https://github.com/google/protobuf/tree/master/csharp(谷歌官方开发、比较晦涩,主库名字:Google.ProtoBuf.dll)

  二、.Net社区版本:https://github.com/mgravell/protobuf-net(.Net社区爱好者开发,写法上比较符合.net上的语法习惯,主库名字:protobuf-net.dll)

  三、.Net社区版本(二):https://github.com/jskeet/protobuf-csharp-port(据说是由谷歌的.net员工为.net开发,在官方没有出来csharp的时候开发,到发博文时还在维护,主库名字:Google.ProtocolBuffers.dll)

至于选用那个版本,跨平台的需求不大的话,可以用版本二、大的话可以选用一或者三。(本文后续选用二为例)

三、ProtoBuf有什么用

  (1)制作网络通信协议。

  (2)数据的存储(序列化和反序列化),类似于xml、json等;

我们先来看(1)。PB可以利用一种语言(作者简称pb语言源码,文件后缀为.proto)转化为通信类(.cs文件,其他语言会生成相应的后缀文件,如.h,.cpp的)。在此过程中需要用protoc.exe命令行工具生成.bin,然后用

ProtoGen.exe生成.cs文件,至于怎么调用命令行,这里不再赘述。倒是可以把这三个文件(有的可能需要ProtoGen.exe.config)放到一个目录下,然后写一个命令行文件.bat直接生成。

echo on

set Path=ProtoGen\protogen.exe

%Path%  -i:Message.proto    -o:OpenAPIModel\Message.cs

pause

注意:不同的版本命令行是不一样的。(如果嫌麻烦,可以自己手撸协议,本人就是这么干的,不过注意各修饰字段,不过手撸只适用于版本二,因为其他的写法生不一样,生成.cs文件的时候需要同时生成一些方法)

我的一个proto文件

message Message
{
required string messageType=;//消息类型,约定link为建立连接消息,command为命令消息,file为文件,fileToClient为到客户端的文件
optional string sourceIp=;
optional string sourcePort=;
optional string content=; //消息内容
optional stirng fileName=;
optional bytes bytes = ;//文件数组
optional string other = ;//预留
optional int32 fileTotalLength = ;//文件总长度
optional int32 fileIndex = ; //当前传输的下标
optional int32 fileTotalCount = ; //文件拆分总个数 }

我自己手撸的文件

using ProtoBuf;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text; namespace AndroidSocketTest
{
[ProtoContract]
public class Message
{
[ProtoMember()]
public string messageType { get; set; }
[ProtoMember()]
public string sourceIp { get; set; }
[ProtoMember()]
public string sourcePort { get; set; }
[ProtoMember()]
public string content { get; set; } //消息内容
[ProtoMember()]
public string fileName { get; set; }
private byte[] _bytes = null;
[global::ProtoBuf.ProtoMember(, IsRequired = false, Name = @"bytes", DataFormat = global::ProtoBuf.DataFormat.Default)]
[global::System.ComponentModel.DefaultValue(null)]
public byte[] bytes
{
get { return _bytes; }
set { _bytes = value; }
}
[ProtoMember()]
public string other { get; set; } //预留
[ProtoMember()]
public int fileTotalLength { get; set; } //文件总长度
[ProtoMember()]
public int fileIndex { get; set; } //文件当前段数
[ProtoMember()]
public int fileTotalCount{get;set; } //文件总片数
} public static class MessageHelp
{
// 将消息序列化为二进制的方法
// < param name="model">要序列化的对象< /param>
public static byte[] Serialize(Message model)
{
try
{
//涉及格式转换,需要用到流,将二进制序列化到流中
using (MemoryStream ms = new MemoryStream())
{
//使用ProtoBuf工具的序列化方法
ProtoBuf.Serializer.Serialize<Message>(ms, model);
//定义二级制数组,保存序列化后的结果
byte[] result = new byte[ms.Length];
//将流的位置设为0,起始点
ms.Position = ;
//将流中的内容读取到二进制数组中
ms.Read(result, , result.Length);
return result;
}
}
catch (Exception ex)
{
return null;
}
} // 将收到的消息反序列化成对象
// < returns>The serialize.< /returns>
// < param name="msg">收到的消息.</param>
public static Message DeSerialize(byte[] msg)
{
try
{
using (MemoryStream ms = new MemoryStream())
{
//将消息写入流中
ms.Write(msg, , msg.Length);
//将流的位置归0
ms.Position = ;
//使用工具反序列化对象
Message result = ProtoBuf.Serializer.Deserialize<Message>(ms);
return result;
}
}
catch (Exception ex)
{
return null;
}
}
}
}

连下面的序列化和反序列化都写好了。

四、proto语法,引用一个同行的博客

http://blog.csdn.net/u014308482/article/details/52958148

有问题请加群沟通qq:568055323

.Net环境下调用ProtoBuf的更多相关文章

  1. C#多线程环境下调用 HttpWebRequest 并发连接限制

    C#多线程环境下调用 HttpWebRequest 并发连接限制 .net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 win ...

  2. java 在centos6.5+eclipse环境下调用opencv实现sift算法

    java 在centos6.5+eclipse环境下调用opencv实现sift算法,代码如下: import org.opencv.core.Core; import org.opencv.core ...

  3. Windows环境下google protobuf入门

    我使用的是最新版本的protobuf(protobuf-2.6.1),编程工具使用VS2010.简单介绍下google protobuf: google protobuf 主要用于通讯,是google ...

  4. 【Tesseract-OCR】在VS2012环境下调用API方法---注意避免名字冲突

    由于在VS2012中使用OpenCV可以得到插件ImageWatch.vsix的支持,查看图像非常方便,所以一直想在VS2012环境下把Tesseract-OCR融合进来,但是这一错误折腾了我好久: ...

  5. 【转】C#多线程环境下调用 HttpWebRequest 并发连接限制

    .net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 windows xp , windows  7 下默认是2,在服务器操作 ...

  6. 多线程环境下调用 HttpWebRequest 并发连接限制

    .net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 windows xp , windows  7 下默认是2,在服务器操作 ...

  7. 非Linux环境下调用sh命令

    方法一:把cygwin的bin配置到环境变量里,这样做了以后在cmd.exe里也可以使用linux的命令 def exe_command(command): p = subprocess.Popen( ...

  8. [zz]C#多线程环境下调用 HttpWebRequest 并发连接限制

    .net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 windows xp , windows 7 下默认是2,在服务器操作系 ...

  9. spring-cloud-kubernetes服务发现之在k8s环境下开发spring cloud应用

    通常情况下,我们的线上的服务在迁移到k8s环境下的时候,都是采用平滑迁移的方案.服务治理与注册中心等都是采用原先的组件.比如spring cloud应用,在k8s环境下还是用原来的一套注册中心(如eu ...

随机推荐

  1. PHP生成器细说

    之前写过关于生成器的文章,可能还不够详细,正好群里有朋友在讨论.觉得还是有必要再细说下,如果大家做过Python或者其他语言的,对于生成器应该不陌生.生成器是PHP 5.5.才引入的功能,也许大家觉得 ...

  2. http协议、web服务器、并发服务器(下)

    Web静态服务器-5-非堵塞模式 单进程非堵塞模型 import socket import time def main(): tcp_socket_server = socket.socket(so ...

  3. Again Prime? No Time.(uva10870+数论)

    Again Prime? No time.Input: standard inputOutput: standard outputTime Limit: 1 second The problem st ...

  4. clean 伪目标

    下面的"clean"目标,是一个"伪目标",      clean:              rm *.o temp  我们生成了许多文件编译文件,我们也应该 ...

  5. Java中的匿名内部类及内部类的二三事

    匿名内部类适合创建那些只需要使用一次的类,它的语法有些奇怪,创建匿名内部类会立即创建一个该类的实例,这个类定义立即消失,且不能重复使用. 定义匿名类的格式如下: new 实现接口() |父类构造器(实 ...

  6. Python3 系列之 环境包管理神器 pipenv

    环境说明:Windows 10 build 17763 + Python 3.7.2 介绍 pipenv 是在 pip 与 virtualenv 基础上发展而来的,弥补了之前 virtualenv 通 ...

  7. idea项目git版本回退

    idea项目git版本回退 一.查询提交历史 项目上右键,点击Git,点击Show History 二.复制版本号 我这里有两个测试的版本,我的当前版本是[二],所以我选择[一],右键,选择Copy ...

  8. C# 任务 数据加载不影响其他操作

    private void button1_Click(object sender, EventArgs e) { //this.timer1.Enabled = true; Task t1 = new ...

  9. sass安装和语法

    1.简介 sass 它的基本思想是,用一种专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件.这被叫做“css预处理器”(css preprocessor).它提供了很便利的语法,节省了我 ...

  10. [待优化笔记]原生JS实现验证框架 checkFun

    ;(function(){ /** 验证框架 checkFun * 使用方法: * <input class="required" type="text" ...