C# 使用google protocolbuffer协议

时间:2022-02-24 14:41:57

简介

google protocolbuffer,google 提供了三种语言的实现:javac++ 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。

可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

以下介绍下C#使用protocolbuffer


 

下载 protobuf-csharp-port-2.4.1.521-release-binaries.zip

http://code.google.com/p/protobuf-csharp-port/


 

proto 文件

//import "Base.proto"; 添加引用文件方式

package Proto;

message LoginRsp
{
required int32 Result = 1;//0:失败,1:成功
optional bytes Cause = 2;
optional bytes guid = 4;//唯一标识请求,可选
}

 

required 必填项

optional 可选项

repeated list项

 


 

 

协议生成

把下载文件中的protoc.exe、ProtoGen.exe、Google.ProtocolBuffers.dll这些文件和bat文件、proto文件放入同一个文件夹

生成协议bat文件格式:

 

@echo on
protoc --descriptor_set_out=LoginRsp.protobin --include_imports LoginRsp.proto
protogen LoginRsp.protobin

 

会在该文件中生成 LoginRsp.cs

 


 

生成要发送协议数据

Proto.LoginRsp.Builder builder = new Proto.LoginRsp.Builder();
builder.Result = 1;
builder.Cause = ByteString.CopyFrom(Cause, Encoding.Default);
builder.Guid= ByteString.CopyFrom(Guid, Encoding.Default); //string 转 ByteString , ByteString 是 Protocol buffer 的类型。

byte[] sendData = builder.Build().ToByteArray();  //发送data

 

解析协议:

Proto.LoginRsp Rsp = Proto.LoginRsp.ParseFrom(netMsg);  //netMsg 生成的协议 byte[] sendData = builder.Build().ToByteArray();

 

StringConvertToByteString
public class StringConvertToByteString
    {
        public static ByteString ConvertToByteString(string text)
        {
            if (text != null)
                return ByteString.CopyFrom(text, Encoding.Default);
            else
                return ByteString.Empty;
        }
        public static ByteString ConvertToByteString(string text, Encoding encoding)
        {
            if (text != null)
                return ByteString.CopyFrom(text, Encoding.Default);
            else
                return ByteString.Empty;
        }
        public static string ConvertToString(ByteString text)
        {
            return text.ToString(Encoding.Default);
        }
        public static string ConvertToString(string value)
        {
            if (!string.IsNullOrEmpty(value))
                return value;
            else
                return string.Empty;
        }
    }