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();

        }

 

posted @ 2016-08-26 16:09  jiajinhao  阅读(2965)  评论(0编辑  收藏  举报