前一篇文章我们看到使用Google.Protobuf有诸多不便(参考《如何在C#中使用Google.Protobuf工具》),这次我们来看看另一个工具的使用体验。

相关资料、链接:

  • github项目:https://github.com/protobuf-net/protobuf-net
  • nuget包名称:protobuf-net、protobuf-net.BuildTools
  • 作者:Marc Gravell
  • 支持.net平台:.net5\.NETFramework4.6.1\.NETStandard2.0等
  • protobuf-net BuildTools文档:https://protobuf-net.github.io/protobuf-net/build_tools

准备工作

在C#中编写目标类型:
在类级别增加注解[ProtoContract],在字段级别增加注解[ProtoMember(orderxxx)]
    [ProtoContract]
public class ErrorLog
{
[ProtoMember(1)]
public string LogID { get; set; }
[ProtoMember(2)] public string Context { get; set; }
[ProtoMember(3)] public string Stack { get; set; }
}

当安装了protobuf-net.BuildTools工具后,还可以在开发时对目标类型(添加了[ProtoContract]注解)的定义进行检查,比如字段顺序重复、使用的字段类型不符合protobuf要求等。比如因疏忽设置了重复的字段顺序,提示效果如下:

序列化操作

        public static byte[] Serialize(ErrorLog log)
{
using (MemoryStream memoryStream = new MemoryStream())
{
ProtoBuf.Serializer.Serialize(memoryStream, log);
return memoryStream.ToArray();
}
}

反序列化操作

        public static ErrorLog DeSerialize(byte[] data)
{
using (MemoryStream ms = new MemoryStream(data))
{
return ProtoBuf.Serializer.Deserialize<ErrorLog>(ms);
}
}

总结、理解

  • 这个工具的使用体验属于Code-First模式,先定义类型,并使用注解进行标记,不需要先编写.proto文件。
  • 通过类库提供的ProtoBuf.Serializer.Serialize()和ProtoBuf.Serializer.Deserialize()分别执行序列化和反序列化,而不用依赖任何生成的代码。
  • 只针对.NET平台的话,不需要.proto文件就可以应用protobuf序列化协议。如果需要跨语言编程,再根据C#类型编写.proto文件(也可以通过工具自动生成proto文件),然后生产目标语言的对应类型。
  • 借助于protobuf-net.BuildTools工具的辅助,可以及早的发现编码错误,一定程度上提高了开发效率。
  • 综上,对于.NET平台为主的开发者来说,使用protobuf-net相对来说代码可读性更高、维护成本更小,同时也能兼顾跨语言开发,建议首先此方式。

C#中使用protobuf-net进行序列化的更多相关文章

  1. 在Wcf中应用ProtoBuf替代默认的序列化器

    Google的ProtoBuf序列化器性能的牛逼已经有目共睹了,可以把它应用到Socket通讯,队列,Wcf中,身为dotnet程序员一边期待着不久后Grpc对dotnet core的支持更期待着Wc ...

  2. 在网络通讯中应用Protobuf

    在网络通讯中应用Protobuf Protobuf的设计非常适用于在网络通讯中的数据载体,它序列化出来的数据量少再加上以K-V的方式来存储数据,对消息的版本兼容性非常强:还有一个比较大的优点就是有着很 ...

  3. 在Dubbo中使用高效的Java序列化(Kryo和FST)

    在Dubbo中使用高效的Java序列化(Kryo和FST) 作者:沈理 文档版权:Creative Commons 3.0许可证 署名-禁止演绎 完善中…… TODO 生成可点击的目录 目录 序列化漫 ...

  4. 在erlang项目中使用protobuf

    在erlang项目中使用protobuf http://blog.csdn.net/mycwq/article/details/21864191 protobuf是google的一个序列化框架,类似X ...

  5. webapi 中使用 protobuf

    相比json来说,好处是速度更快,带宽占用更小.其效果大致等于json+Gzip. 在webapi中使用protobuf的方法为: 引用nuget包 Install-Package protobuf- ...

  6. 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化

    谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...

  7. ASP.NET Web API中的JSON和XML序列化

    ASP.NET Web API中的JSON和XML序列化 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok ...

  8. 怎样在Spark、Flink应用中使用Protobuf 3的包

    如果在在Spark.Flink应用中使用Protobuf 3的包,因为Spark默认使用的是2.5版本的包,提交任务时,可能会报如下异常: com.google.protobuf.CodedInput ...

  9. 在lua环境中使用protobuf

    最近在cocos2dx的项目中,需要在LUA脚本层使用protobuf协议.官方已经推出了很多种语言的版本.但唯独LUA版本不全.于是开始研究protobuf在LUA下的实现,将完整的过程记录了下来, ...

  10. 在 Java 中使用 protobuf

    在 Java 中使用 protobuf 从 https://github.com/google/protobuf/releases 下载编译器,并设置环境变量. 创建java项目添加protobuf- ...

随机推荐

  1. 学习使用SignalR

    1.创建空白的控制台程序 2.添加两个NuGet包(Microsoft.AspNet.SignalR.SelfHost.Microsoft.Owin.Cors.Topshelf)Topshelf用于快 ...

  2. C#开发BIMFACE系列46 服务端API之离线数据包下载及结构详解

    BIMFACE二次开发系列目录     [已更新最新开发文章,点击查看详细] 在前一篇博客<C#开发BIMFACE系列45 服务端API之创建离线数据包>中通过调用接口成功的创建一个离线数 ...

  3. 题解 Yuno loves sqrt technology II

    题目传送门 题目大意 有\(n\)个数,\(m\)个查询,每次查询一个区间内的逆序对个数. \(n,m\le 10^5\) 思路 其实是为了锻炼二次离线才做这道题的. 不难想到可以有一个\(\Thet ...

  4. 电脑(windows)端口被占用如何解决

    问题: 今天在启动项目的时候,控制台提示"8080端口被占用",此时我并没有启动其他项目.那么8080端口被占用解决方法如下: 1.点击左下角"开始",在搜索框 ...

  5. FastAPI 学习之路(十五)响应状态码

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  6. Ubuntu安装 配置GCC和Vim

    VMware14.0和Ubuntu镜像安装 https://mp.weixin.qq.com/s/045wrbdv92PkUQn2abddvA 适应屏幕设置 按照下列流程检查虚拟机设置 查看 -> ...

  7. Unity——计时器功能实现

    Unity计时器 Demo展示 介绍 游戏中有非常多的计时功能,比如:各种cd,以及需要延时调用的方法: 一般实现有一下几种方式: 1.手动计时 float persistTime = 10f flo ...

  8. 【UE4 C++】获取运行时间、设置时间流速、暂停游戏

    基于UGameplayStatics 获取运行时间 /** Returns the frame delta time in seconds, adjusted by time dilation. */ ...

  9. 解决git clone慢问题

    解决git clone慢 关于Git克隆或是上传代码龟速的问题真是让人很恼火,这里对于网上的两种解决方案进行摘录. 利用码云克隆github项目 亲测有效 进入码云,新建一个仓库: 在创建的最后选择导 ...

  10. 2021.8.15考试总结[NOIP模拟40]

    T1 送花 线段树.枚举右端点,线段树记录左端点对应的值. 每次对当前颜色上上次出现的位置到上次出现的位置区间减,上次出现的位置到当前位置区间加. $code:$ 1 #include<bits ...