序列化悍将Protobuf-Net,入门动手实录

摘要:
StackService在Github上收取超过2K颗星的费用。webapi2也可以做到这一点,因此也省略了。

最近在研究web api 2,看了一篇文章,讲解如何提升性能的

序列化悍将Protobuf-Net,入门动手实录第1张

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

1:安装篇

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

序列化悍将Protobuf-Net,入门动手实录第2张

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("
****解析部分*****");

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


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

            Console.Read();
        }
    }
}

控制台运行结果

序列化悍将Protobuf-Net,入门动手实录第3张

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

序列化悍将Protobuf-Net,入门动手实录第4张

本章代码下载:猛击我

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

后记

protobuf虽然有千般好,但是我们是在 web api上使用的,前台js解析不了Protobuf,所以只能用Json咯~!

StackService虽然Github上有2K多个Star,但是收费的。。同样的事情web api 2也能做到,所以也略过它。

最终作者选择了跑分测试里面的第二名Jil  https://github.com/kevin-montrose/Jil

免责声明:文章转载自《序列化悍将Protobuf-Net,入门动手实录》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇安卓自动化单元测试——登录模块测试一个故事告诉你比特币的原理及运作机制下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

.net学习笔记---xml序列化

 XML序列化是将对象的公共属性和字段转换为XML格式,以便存储或传输的过程。反序列化则是从XML输出中重新创建原始状态的对象。XML序列化中最主要的类是XmlSerializer类。它的最重要的方法是Serialize和Deserialize方法,它位于System.Xml.Serialization命名空间。 一、XML序列化基本要点   在本节开始之...

spring boot -- 控制器类中方法返回对象json序列化

前言   fastjson:是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Java语言中最快的JSON库。Fastjson接口简单易用,已经被广泛使用在缓存序列化、协议交互、Web输出、Android客户端等    Jackson:是spring boot 默认的解析...

继承LIst 的类JSON序列化,无法序列化属性的问题

/// <summary> /// Paged list /// </summary> /// <typeparam name="T">T</typeparam> [JsonObject(MemberSerialization = MemberSerialization...

redis 序列化存入对象

redis 序列化存入对象 //序列化 public static byte[] serialize(Object obj){ ObjectOutputStream obi=null; ByteArrayOutputStream bai=null; try{ ba...

从数据库里面取值绑定到Ztree

1、效果图(思路:将数据库表按照一定的格式排序,然后序列化成json字符串,绑定到Ztree上并显示出来) zTree v3.5.16 API 文档 :http://www.ztree.me/v3/api.php 2、添加应用及显示的位置,设置树需要绑定的字段,与数据库里面的表字段有关(备注:设置树为展开状态) <script src="/comm...

序列化器关系 (Serializer relations)

糟糕的程序员担心代码。好的程序员担心数据结构和它们的关系。—— Linus Torvalds 关系字段用于表示模型关系。它们可以应用于 ForeignKey,ManyToManyField 和 OneToOneField 关系,以及反向关系和自定义关系 (例如:GenericForeignKey)。 注意:关系字段在 relations.py 中声明,但...