Protocol buffer的使用
protocol buffer是google 的一种数据交换的格式,它独立于语言,独立于平台。提供多种语言的实现接口:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
下边简单介绍如何在网络通讯中,对二进制数据进行序列化、反序列化解析的使用。
C# 中使用方法
1、在VS中通过nuget引入protocol-net,如下图:
2、新建测试类
[ProtoContract]
public class LoginMessage
{
#region 属性
[ProtoMember(1)]
public string Key { get; set; }
[ProtoMember(2)]
public Int64 SendTime { get; set; }
[ProtoMember(3)]
public string SerialNumber { get; set; }
[ProtoMember(4)]
public string CtrlProtoVersion { get; set; }
[ProtoMember(5)]
public string CtrlVendor { get; set; }
[ProtoMember(6)]
public string CtrlSwVersion { get; set; }
[ProtoMember(7)]
public string CtrlHwType { get; set; }
[ProtoMember(8)]
public string DataCenter { get; set; }
[ProtoMember(9)]
public int CtrlStatus { get; set; }
[ProtoMember(10)]
public int BillCount { get; set; }
[ProtoMember(11)]
public string Reserved1 { get; set; }
[ProtoMember(12)]
public string Reserved2 { get; set; }
#endregion
}
帮助类:
public class ProtobufHelp
{
public static byte[] ObjectToBytes<T>(T instance)
{
try
{
byte[] array;
if (instance == null)
{
array = new byte[0];
}
else
{
MemoryStream memoryStream = new MemoryStream();
Serializer.Serialize(memoryStream, instance);
array = new byte[memoryStream.Length];
memoryStream.Position = 0L;
memoryStream.Read(array, 0, array.Length);
memoryStream.Dispose();
}
return array;
}
catch (Exception ex)
{
return new byte[0];
}
}
public static T BytesToObject<T>(byte[] bytesData, int offset, int length)
{
if (bytesData.Length == 0)
{
return default(T);
}
try
{
MemoryStream memoryStream = new MemoryStream();
memoryStream.Write(bytesData, 0, bytesData.Length);
memoryStream.Position = 0L;
T result = Serializer.Deserialize<T>(memoryStream);
memoryStream.Dispose();
return result;
}
catch (Exception ex)
{
return default(T);
}
}
}
3、使用
LoginMessage login = new LoginMessage();
login.Key = "123";
byte[] data = ProtobufHelp.ObjectToBytes(login );
var tempLogin = ProtobufHelp.BytesToObject(data );