• protobuf-net 对象二进制序列化与反序列号(转)


    概述:

    Protobuf是google开源的一个项目,用户数据序列化反序列化,google声称google的数据通信都是用该序列化方法。它比xml格式要少的多,甚至比二进制数据格式也小的多。

    Protobuf格式协议和xml一样具有平台独立性,可以在不同平台间通信,通信所需资源很少,并可以扩展,可以旧的协议上添加新数据;

    Protobuf是在java和c++运行的,Protobuf-net当然就是Protobuf在.net环境下的移植。

    使用:

    1、安装,通过NuGet安装Protobuf-net;

    2、代码使用事例:

    定义序列号帮助类

    public class ProtoBufHelper
        {
            public static byte[] Serializeby(object obj)
            {
                using (var stream = new MemoryStream())
                {
                    Serializer.Serialize(stream, obj);
                    return stream.ToArray();
                }
            }
            /// <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;
                }
            }
        }

    定义序列号对象:

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

    序列化方法调用:

    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 };
                var Curr = ProtoBufHelper.Serializeby(pSource);
    
                string content = ProtoBufHelper.Serialize<List<Person>>(pSource);
                Console.Write(content);
                //
                File.WriteAllText("D://Hell.bin", content);
                Console.WriteLine("*****解析二进制***");
                List<Person> pResult = ProtoBufHelper.DeSerialize<List<Person>>(content);
                foreach (Person p in pResult)
                {
                    Console.WriteLine(p.Name);
                }
                Console.Read();
    
            }
  • 相关阅读:
    课程安排及脉络
    面向对象 魔法方法 单例(五)
    练习项目:选课系统
    面向对象 多态 类方法 反射 (四)
    面向对象(三) 组合 封装
    面向对象编程(二)
    面向对象编程(一)
    python入门总复习
    模块(四)
    模块(三)
  • 原文地址:https://www.cnblogs.com/xibei666/p/5810781.html
Copyright © 2020-2023  润新知