zoukankan      html  css  js  c++  java
  • MsgPack-一个简单的序列化框架

    MsgPack是一个简单高效的序列化框架。

    通过以下代码可以了解到

    1.通过数组索引代替键值对,有效的减小数据大小;

    2.类中字段按照自母排序序列化;

    3.父类和子类的所有字段按照字母排序进行序列化;

    4.字段按照字母排序,会导致后续类扩展的兼容性问题;

    using MsgPack;
    using MsgPack.Serialization;
    using System;
    using System.Collections.Generic;
    using System.IO;
    
    namespace ConsoleApp1
    {
        public class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
    
            public Person Father { get; set; }
    
            public List<Person> Teachers { get; set; }
    
            public IDictionary<string, Person> Courses { get; set; }
        }
    
        public class Worker:Person
        {
            public double Salary { get; set; }
        }
    
        public class Program
        {
            public static void Main(string[] args)
            {
                var person = new Person()
                {
                    Name = "mango",
                    Age = 10,
                    Father = new Person()
                    {
                        Name = "father"
                    },
                    Courses = new Dictionary<string, Person>() {
                        { "math", new Person() { Name= "math teacher" } }
                    },
                    Teachers = new List<Person>() {
                        new Person() { Name= "english teacher" }
                    }
                };
    
                var worker = new Worker()
                {
                    Name = "worker",
                    Age = 30,
                    Father = new Person()
                    {
                        Name = "father"
                    },
                    Courses = new Dictionary<string, Person>() {
                        { "math", new Person() { Name= "math teacher" } }
                    },
                    Teachers = new List<Person>() {
                        new Person() { Name= "english teacher" }
                    },
                    Salary = 10000
                };
    
                var data = SerializePerson(person);
                ShowPersonPackStructure(data);
                ShowWorkerPackStructure(worker);
                UsePackerPack();
    
                
                Console.Read();
            }
    
            static byte[] SerializePerson(Person person)
            {
                var serializer = MessagePackSerializer.Get<Person>();
                var data = Pack<Person>(serializer, person);
                NewtonSerialize(person);
                return data;
            }
    
            static void ShowPersonPackStructure(byte[] data)
            {
                ExploreMsgPackStructure(data, typeof(Person).Name);
            }
    
            static void ShowWorkerPackStructure(Worker worker)
            {
                var serializer = MessagePackSerializer.Get<Worker>();
                var data = Pack(serializer, worker);
                ExploreMsgPackStructure(data, worker.GetType().Name);
            }
    
            static void UsePackerPack()
            {
                var stringData = Pack();
                ExploreMsgPackStructure(stringData, " Packer");
            }
    
            static void NewtonSerialize(Person person)
            {
                var jsonObj = Newtonsoft.Json.JsonConvert.SerializeObject(person);
                var jsonData = System.Text.Encoding.Default.GetBytes(jsonObj);
                Console.WriteLine("json serialize "+ person .GetType().Name+ " size is " + jsonData.Length);
            }
    
           static byte[] Pack<T>(MessagePackSerializer<T> serializer,  object obj)
            {
                using (var stream = new MemoryStream())
                {
                    serializer.Pack(stream, obj);
                    using (FileStream fs = new FileStream(obj.GetType().Name + ".txt", FileMode.OpenOrCreate))
                    {
                        var data = stream.ToArray();
                        Console.WriteLine("msgpack packed "+ obj.GetType().Name + " size is " + data.Length);
                        fs.Write(data, 0, data.Length);
                        return data;
                    }
                }
            }
    
            static byte[] Pack()
            {
                using (var stream = new MemoryStream())
                {
                    var packer = Packer.Create(stream);
                    packer = packer.PackString("mango");
                    packer = packer.PackString("is");             
                    packer = packer.Pack(10);
                    packer = packer.PackString("years");
                    packer = packer.PackCollection<string>(new List<string>() { "this is a list"});
                    var data = stream.ToArray();
                    return data;
                }
            }
    
            static void ExploreMsgPackStructure(byte[] packData, string objectName)
            {
                Console.WriteLine("msgpack  "+ objectName+" structure is :");
                int position = 0;
                while (position < packData.Length)
                {
                    var obj = Unpacking.UnpackObject(packData, position);
                    Console.WriteLine(obj.Value);
                    position += obj.ReadCount;
                }
            }
        }
    
    
    }
    

    执行结果

    msgpack packed Person size is 66
    json serialize Person size is 294
    msgpack  Person structure is :
    [ 10, { "math" : [ 0, null, null, "math teacher", null ] }, [ 0, null, null, "father", null ], "mango", [ [ 0, null, null, "english teacher", null ] ] ]
    msgpack packed Worker size is 76
    msgpack  Worker structure is :
    [ 30, { "math" : [ 0, null, null, "math teacher", null ] }, [ 0, null, null, "father", null ], "worker", 10000, [ [ 0, null, null, "english teacher", null ] ] ]
    msgpack   Packer structure is :
    mango
    is
    10
    years
    [ "this is a list" ]
    

      

      

  • 相关阅读:
    U1
    std::vector的内存释放
    (转)浅谈PostgreSQL的索引
    PostgreSQL的generate_series函数应用
    linux 里的`反引号
    wireshark抓取本地回环数据包
    linux shell中 if else以及大于、小于、等于逻辑表达式介绍
    c++利用互斥锁实现读写锁
    c++互斥锁的实现
    大小端,"字节序"
  • 原文地址:https://www.cnblogs.com/wufengtinghai/p/12482921.html
Copyright © 2011-2022 走看看