当我们要使用protobuf进行协议编写,且需要协议在网络中传输的时候,就需要将类或者xxx.proto 文件序列化
当需要将类序列化,且使用protobuf的时候,我们需要引入Google.Protobuf.Tools 3.6.1 和 protobuf-portable-net 2.0.0.668 这两个库,版本根据需要自行选择
引入类库完成后,将需要序列化的类添加注解,例如下方类
[ProtoContract] //该注解就表示该类是protobuffer 需要序列化的类
public class TestProtobuf
{
[ProtoMember(1)] // 每个属性都加上这个
public string Name { get; set; }
[ProtoMember(2)]
public int Age { get; set; }
[ProtoMember(3)]
public string Describe { get; set; }
}
下面是序列化 和 反序列化的方法
private static byte[] Serialize(object t)
{
using (MemoryStream ms = new MemoryStream())
{
ProtoBuf.Serializer.Serialize(ms, t);
byte[] bytes = new byte[ms.Length];
ms.Position = 0;
ms.Read(bytes, 0, bytes.Length);
return bytes;
}
}
private static byte[] Serialize(object t)
{
using (MemoryStream ms = new MemoryStream())
{
ProtoBuf.Serializer.Serialize(ms, t);
byte[] bytes = new byte[ms.Length];
ms.Position = 0;
ms.Read(bytes, 0, bytes.Length);
return bytes;
}
}
当我们需要将xxx.proto生成的xxx.cs文件序列化的时候
//这是我们xxx.proto 生成LoginExample 生成的类
Test.LoginExample loginExample = new Test.LoginExample();
loginExample.Loginid = 1;
loginExample.Loginname = "Success";
loginExample.LoginInfo = "This is Test Example Please Say 6 6 6";
//直接进行序列化
byte[] bytes = loginExample.ToByteArray();
//直接进行反序列化
LoginExample v = LoginExample.Parser.ParseFrom(bytes);