ProtoBuf 对象转换

(运行场景 所有设备启动后 需要不间断的发送请求 然后接收请求 获取很多设备的运行状态 )

通过与采集工控机去对接 对方工程师要求用ProtoBuf去转换对象传送数据 说是运行起来 会比json节省资源 速度会比json反应快些

回来查资料学习了一下

需要一下几步

第一步 创建 .proto 文件

//交互接口协议
syntax = "proto3";

package dome_mm;

message sss_c
{
    int32 s1 = 1;
    string s2 = 2;
    double s3 = 3;
}

详细说明下

syntax = "proto3"; 交互接口协议

dome_mm 是命名空间

sss_c 对象类

s1,s2,s3 字段

 

第二步 运行生成 .cs 类

这里运行时只运行 protoc.exe这个程序

https://github.com/protocolbuffers/protobuf/releases/tag/v3.8.0

东西在这里面下载 我用的是这个protoc-3.8.0-win64.zip

然后进入命令窗口 cd+空格+文件夹路径 跳到protoc.exe程序文件夹

输入 protoc ./test.proto --csharp_out=./  

test.proto是创建的.proto文件

 执行命令后 会生成 .cs 文件  直接扔到项目中

 

第三步 编写序列化和反序列化类

    public class Protobuff
    {
        
        /// <summary>
        /// 序列化
        /// </summary>
        public static byte[] Serialize<T>(T obj) where T : IMessage
        {
            return obj.ToByteArray();
        }

        /// <summary>
        /// 反序列化
        /// </summary>
        public static T Deserialize<T>(byte[] data) where T : class, IMessage, new()
        {
            T obj = new T();
            IMessage message = obj.Descriptor.Parser.ParseFrom(data);
            return message as T;
        }
    }

 

第四步 可以肆无忌惮的使用了

sss_c sc = new sss_c();
//对象序列化
var bytes = Protobuff.Serialize<sss_c>(sc);
//对象反序列化
var recv = Protobuff.Deserialize<sss_c>(buff);

 

上一篇:client: c#+protobuf, server: golang+protobuf


下一篇:C++ protobuf 将从txt读取到的数据赋值到proto上方法