资讯专栏INFORMATION COLUMN

C#中使用protobuf-net进行序列化

不知名网友 / 2601人阅读

摘要:通过类库提供的和分别执行序列化和反序列化,而不用依赖任何生成的代码。只针对平台的话,不需要文件就可以应用序列化协议。

前一篇文章我们看到使用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(ms);            }        }

 

总结、理解 

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

 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/125111.html

相关文章

  • C#列化XML异常:在 XML文档(0, 0)有一个错误“缺少根元素”

    摘要:在反序列化字符串为对象时,抛出如下异常。即在文档中有一个错误缺少根元素。首先看下代码抛出异常是在这里出现的。问题在于这里,原因是进行了写入操作,最后流的位置停留在尾部。因此,在反序列化之前将流的位置定位到开始的位置即可。 Q: 在反序列化 Xml 字符串为 Xml 对象时,抛出如下异常。showImg(https://segmentfault.com/img/bVHTdx?w=576&...

    scq000 评论0 收藏0
  • 集合数据处理(C#、JavaScript 和 Java)

    摘要:系列公用委托都用于委托带有返回值的的方法,所有都是最后一个参数代表返回值类型。的字面对象据称也是哈希实现。 Java 丢了好多年,最近在拣起来,首先当然是了解这么多年来它的变化,于是发现了 Java 8 的java.util.stream。在学习和试验的过程中,相比较于 C# 和 javascript,有那么些心得,作文以记之。 早些时间写过一篇《ES6 的 for..of 和 Ge...

    zacklee 评论0 收藏0
  • 集合数据处理(C#、JavaScript 和 Java)

    摘要:系列公用委托都用于委托带有返回值的的方法,所有都是最后一个参数代表返回值类型。的字面对象据称也是哈希实现。 Java 丢了好多年,最近在拣起来,首先当然是了解这么多年来它的变化,于是发现了 Java 8 的java.util.stream。在学习和试验的过程中,相比较于 C# 和 javascript,有那么些心得,作文以记之。 早些时间写过一篇《ES6 的 for..of 和 Ge...

    sherlock221 评论0 收藏0

发表评论

0条评论

不知名网友

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<