C#使用protobuf-net进行序列化的详细操作
作者:chenzk的博客 发布时间:2021-11-17 02:32:41
protobuf 是 google的一个开源项目,可用于以下两种用途:
(1)数据的存储(序列化和反序列化),类似于xml、json等;
(2)制作网络通信协议。
源代码下载地址:https://github.com/mgravell/protobuf-net;
开源项目地址如下:https://code.google.com/p/protobuf-net/。
前一篇文章我们看到使用Google.Protobuf有诸多不便(参考《www.jb51.net/article/230186.htm》),这次我们来看看另一个工具的使用体验。
相关资料、链接:
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相对来说代码可读性更高、维护成本更小,同时也能兼顾跨语言开发,建议首先此方式。
来源:https://www.cnblogs.com/chen943354/p/15601287.html


猜你喜欢
- Java 异步实现的几种方式1. jdk1.8之前的Futurejdk并发包里的Future代表了未来的某个结果,当我们向线程池中提交任务的
- 前言相信大家在写前端脚本的时候经常会遇到发送数据到后台的情况,但是由于浏览器的限制,不同域名之间的数据是不能互相访问的,那前端怎么和后端如何
- 今天给大家介绍一下一个web 中经常会用到的截图(如:头像等)工具:Jcrop演示项目结构:效果图:这个很有用:看到这些,大家也想自己试试吧
- 前言关于日志级别,大部分项目可能都设置为info级别,当然也可能有一些追求性能或者说包含很多敏感信息的项目直接将级别设置为warn或者err
- 在Android系统中提供了多种存储技术.通过这些存储技术可以将数据存储在各种存储介质上.比如sharedpreferences可以将数据保
- System.getProperty(user.dir)定位问题前言随着学习java web 的深入学习,为了巩固自己的学习成果,练习了一个
- 如下所示:from jpype import *jvmPath = getDefaultJVMPath()jars = ["./F
- 前言每次update Maven Project 的时候,看着进度条寸步难行,心里憋得十分难受,明显阻碍我学习的热情。 maven仓库默认在
- 前言项目使用了SpringBoot构建项目。下面对动态调整日志的级别进行记录。从版本 1.5.1 之后就提供了基于 spring-boot-
- RecyclerView 是 android-support-v7-21 版本中新增的一个 Widgets, 还有一个 CardView 会
- 目录一.什么是负载均衡二.负载均衡的简单分类三.为什么需要做负载均衡四.springCloud如何开启负载均衡五.IRule1.Random
- 要求:如下图,使用线程操作 1、实时显示当前时间 2、输入加数和被加数,自动出现结果 分析:两个问题解决的方式一致,使用子线程进
- 判断用户输入的是否至少含有N位小数。1.当用户输入的是非数字时抛出异常,返回false。2.当用户输入数字是,判断其数字是否至少含有N位小数
- 第一部分:Java数据结构要理解Java数据结构,必须能清楚何为数据结构?数据结构:Data_Structure,它是储存数据的一种结构体,
- 本文实例为大家分享了Android实现录音静音降噪的具体代码,供大家参考,具体内容如下需求:客户反馈产品的录音里面很多杂音(因为我们把Cod
- 静态成员变量与非静态成员变量的区别以下面的例子为例说明package cn.galc.test;public class Cat {/**
- 以Java web的方式显示图片到浏览器以Java web的方式下载服务器文件到浏览器以Spring Boot的方式显示图片或下载文件到浏览
- 现在的大部分框架都是 MVC 模式,但 MVC 三个部分怎么配合,这里做了一点总结:基本原则:业务逻辑代码应该写在 M 里面,而应用程序逻辑
- 前言在前后端分离开发的项目当中为了避免重复构建发布,我们需要部署一个持续发布环境,而目前的开发环境服务器都是基于 CentOS 的,因此每次
- 接口(interface)和抽象类(abstract class)是支持抽象类定义的两种机制。接口是公开的,不能有私有的方法或变量,接口中的