• C#使用proto


    写多了go代码,被go mod tidy惯坏了,还以为全天下的都很好用呢,结果发现并不是这样。尤其是项目组的proto还是又封了个工具直接就能跑得,导致以为没那么复杂的事情变得复杂了起来。是有两套生成的规则,时间有点晚,没怎么仔细研究,先记录一下。

    先用nuget装protobuf-net、Google.Protobuf,这两个软件包
    在这里插入图片描述
    在这里插入图片描述

    protoc生成

    不过我发现了,C#和其他语言不太语言,可以protoc生成C#代码,然后使用的是Google.Protobuf这个包。
    在Net Core6.0中是这么写的
    这样生成 protoc --csharp_out=proto test.proto

    syntax = "proto3";                // proto 版本
    option go_package = "paramecium/proto/test"; // 包名声明符
    option csharp_namespace = "test";
    
    message SearchResultPage2 {
      string result = 1;
      int32 num_results = 2;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    using Google.Protobuf;
    
    Console.WriteLine("Hello, World!");
    SearchResultPage2 s = new SearchResultPage2();
    s.Result = "100";
    
    byte[] bytes = s.ToByteArray();
                
    SearchResultPage2 deserializedPerson = SearchResultPage2.Parser.ParseFrom(bytes);
    Console.WriteLine("result:{0}",deserializedPerson.Result);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    protogen生成

    这个生成出来的代码不能用Google.Protobuf这个包,要使用protobuf-net这个包才行,并且代码也不太一样,这个没有具体运行过,来一份ChatGPT给的代码,主要可以看下序列化和反序列化的接口

    using System;
    using System.IO;
    using ProtoBuf;
    
    namespace Example
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Create a new person object
                Person person = new Person { 
                    id = 1001, 
                    name = "Tom", 
                    age = 26, 
                    isEmployed = true 
                };
    
                // Serialize person to a byte array
                byte[] buffer;
                using (MemoryStream stream = new MemoryStream())
                {
                    Serializer.Serialize(stream, person);
                    buffer = stream.ToArray();
                }
    
                // Deserialize byte array to a new person object
                Person newPerson;
                using (MemoryStream stream = new MemoryStream(buffer))
                {
                    newPerson = Serializer.Deserialize<Person>(stream);
                }
    
                // Output the deserialized person object
                Console.WriteLine($"Name: {newPerson.name}");
                Console.WriteLine($"Age: {newPerson.age}");
                Console.WriteLine($"Employed: {newPerson.isEmployed}");
                Console.ReadLine();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
  • 相关阅读:
    spring boot logback日志配置文件
    Matlab滤波器设计示例
    Shell-条件控制语句2
    【Java 进阶篇】Java Filter 执行流程及生命周期详解
    玩转 CODING 自动化助手,助力高效研发!
    yolov1-yolov5 网络结构&正负样本筛选&损失计算
    A2l文件解析
    搭建自己的以图搜图系统 (一):10 行代码以图搜图
    Oracle常用运维SQL-SQL执行性能及锁表等查询分析
    【Java】static关键字,内部类
  • 原文地址:https://blog.csdn.net/dxgzg/article/details/132703002