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的简单应用了

浙公网安备 33010602011771号