在序列化速度的跑分中,Protobuf一骑绝尘,序列化速度快,性能强,体积小,所以打算了解下这个利器

1:安装篇

谷歌官方没有提供.net的实现,所以在nuget上找了一个移植的

Nuget里搜索Protobuf-net,下载,自动添加到项目中

2:定义数据结构

using ProtoBuf;

namespace ConsoleApplication1
{
    [ProtoContract]
    class Person
    {
        [ProtoMember(1)]
        public int Id { get; set; }
        [ProtoMember(2)]
        public string Name { get; set; }
        [ProtoMember(3)]
        public Address Address { get; set; }
    }
    [ProtoContract]
    class Address
    {
        [ProtoMember(1)]
        public string Line1 { get; set; }
        [ProtoMember(2)]
        public string Line2 { get; set; }
    }
}

3:封装简单操作类

按照作者使用习惯,简单提供了一个Helper类

using System.IO;
using System.Text;
using ProtoBuf;

namespace ConsoleApplication1
{
   public class ProtobufHelper
    {
       /// <summary>
       /// 序列化
       /// </summary>
       /// <typeparam name="T"></typeparam>
       /// <param name="t"></param>
       /// <returns></returns>
       public static string Serialize<T>(T t)
       {
           using (MemoryStream ms = new MemoryStream())
           {
               Serializer.Serialize<T>(ms, t);
               return Encoding.UTF8.GetString(ms.ToArray());
           }
       }

       /// <summary>
       /// 反序列化
       /// </summary>
       /// <typeparam name="T"></typeparam>
       /// <param name="content"></param>
       /// <returns></returns>
       public static T DeSerialize<T>(string content)
       {
           using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(content)))
           {
               T t = Serializer.Deserialize<T>(ms);
               return t;
           }
       }
    }
}

4:操作体验

代码很简单,就不分开贴了

using System;
using System.Collections.Generic;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            var p1 = new Person
            {
                Id = 1,
                Name = "八百里开外",
                Address = new Address
                {
                    Line1 = "Line1",
                    Line2 = "Line2"
                }
            };

            var p2 = new Person
            {
                Id = 2,
                Name = "一枪",
                Address = new Address
                {
                    Line1 = "Flat Line1",
                    Line2 = "Flat Line2"
                }
            };

            List<Person> pSource = new List<Person>() { p1, p2 };

            string content = ProtobufHelper.Serialize<List<Person>>(pSource);

            Console.Write(content);
            //写入文件
            File.WriteAllText("D://hello.txt", content);

            Console.WriteLine("\r\n****解析部分*****");

            List<Person> pResult = ProtobufHelper.DeSerialize<List<Person>>(content);

            foreach (Person p in pResult)
            {
                Console.WriteLine(p.Name);
            }

            Console.Read();
        }
    }
}

控制台运行结果

同样的数据,和Json所占用空间对比,高下立判

本章代码下载:猛击我

如果提示没有protobuf,请查看第一步前往nuget下载

跑分测试里面第二名JIL  https://github.com/kevin-montrose/Jil

最新文章

  1. java编码
  2. 2. Add Two Numbers——Python
  3. inux中shell截取字符串方法总结
  4. qt qml 九宫格划指锁屏视图
  5. AutoVue打开ProE工程图中文乱码
  6. Error &amp;&amp; MFC
  7. spring AOP advice 类型 和 通用的切点的配置方式
  8. 启用PowerShell Web Access
  9. facebook分块加载,页面优化,BigPipe,简单实例
  10. WINDOWS+NGINX+DJANGO+FLUP+PYTHON起步~
  11. 【计算几何初步-判断是否凸多边形】【HDU2108】Shape of HDU
  12. [Cocoa]深入浅出 Cocoa 之消息
  13. Redis协议详解
  14. Unity文档总结(2)-Understanding Automatic Memory Management
  15. 网络基础Cisco路由交换四
  16. EOS 新增的 WebAssembly 解释器,是什么鬼?
  17. Spring知识点回顾(07)事件发布和监听
  18. DataContractJsonSerializer序列化时间类型时转换为UTC溢出问题
  19. Linux IPC实践(8) --共享内存/内存映射
  20. String方法

热门文章

  1. VisualSVN-Server 安装以及使用教程
  2. 快速入门系列--MVC--05行为
  3. KendoUI系列:DatePicker
  4. VS 添加Snippets
  5. poj2186Popular Cows(Kosaraju算法--有向图的强连通分量的分解)
  6. php基础教程-变量
  7. Kubernetes系统架构简介--转
  8. 自制jquery可编辑的下拉框
  9. Testing - 质量保证与质量控制
  10. Effeckt.css – CSS3 Transitions &amp; Animations 精妙应用