Andy  
一个快乐的码农,专注于NET平台技术(WPF/WCF/EF....)

protobuf是一个高效灵活的开源的序列化框架,类似于XML,JSON,其最大的特点是基于二进制。

使用Protobuf反序列化的对象类型,必须声明[ProtoContract]特征,且相应属性必须声明[ProtoMember(序号)]特征

例如:

    [ProtoContract]
    public class UserModel {
        [ProtoMember(1)]
        public string Name { get; set; }
        [ProtoMember(2)]
        public string Password { get; set; }
    }

序列化和序列化

            MemoryStream ms= new MemoryStream ();
            UserModel objUserModel = new UserModel {
                Name = "ANdy",
                Password = "andy1987"
            };

            ProtoBuf.Serializer.Serialize<UserModel>(ms, objUserModel);
            byte[] byBuffers = new byte[ms.Length];
            Array.Copy(ms.GetBuffer(), 0, byBuffers, 0, byBuffers.Length);

            ms.Position = 0;
            UserModel userModel = ProtoBuf.Serializer.Deserialize<UserModel>(ms);
            string strMessage = "Name:" + userModel.Name + "\nPassword:" + userModel.Password ;
            MessageBox.Show(strMessage);

序列化和反序列化话还可以通过

ProtoBuf.Meta.RuntimeTypeModel.Default.Serialize()
ProtoBuf.Meta.RuntimeTypeModel.Default.Deserialize()

如果待反序列化的对象结构存在继承关系,那么超类需要加上protoInclude(int tag,string type)特征来描述

例如:

    [ProtoContract]
    [ProtoInclude(10,typeof(AndyUserModel))]
    public class UserModel {
        [ProtoMember(1)]
        public string Name { get; set; }
        [ProtoMember(2)]
        public string Password { get; set; }
    }

   
    [ProtoContract]
    public class AndyUserModel : UserModel {
        [ProtoMember(1)]
        public string Field { get; set; }
    }

如果不加protoInclude的话,那么在序列化AndyUserMode的时候将丢失超类UserModel的Name 和Address值,所以必须告诉protobuf如果进行序列化对象在序列化时候将那些结构包含在内,protoInclude类似WCF的KnownType

如果不在对象结构上添加ProtoInclude特征可以通过code来实现:

            ProtoBuf.Meta.RuntimeTypeModel.Default.Add(typeof(UserModel), true)
                .AddSubType(10, typeof(AndyUserModel));

以上就是关于Protobuf的简单应用了

posted on 2013-06-25 22:38  mrkrcl  阅读(2212)  评论(0)    收藏  举报