序列化悍將Protobuf-Net,入門動手實錄


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

在序列化速度的跑分中,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下載

 

后記

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

StackService雖然Github上有2K多個Star,但是收費的。。同樣的事情web api 2也能做到,所以也略過它。

最終作者選擇了跑分測試里面的第二名Jil  https://github.com/kevin-montrose/Jil

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM