关于proto的安装与使用,这方面网上已经很多教程,在此就不再追叙。Csharp版本可在Github中找到,直接生成Google.Protobuf.dll即可。
在U3D中,序列化与反序列化的方法如下:
首先是引用库
using Google.Protobuf;
using Google.Protobuf.Reflection;
然后是序列化与反序列化方法
//序列化对象
public byte[] Serialize<T>(IMessage t)
{
using (MemoryStream stream = new MemoryStream())
{
CodedOutputStream output = new CodedOutputStream(stream);
output.WriteMessage(t);
output.Flush();
byte[] result = stream.ToArray();
return result;
}
}
//反序列化对象
public T Deserialize<T>(byte[] dataBytes) where T : IMessage, new()
{
CodedInputStream stream = new CodedInputStream(dataBytes);
T msg = new T();
stream.ReadMessage(msg);
return msg;
}
关于要使用的Google.Protobuf.dll,我已经上传到资源中。直接将该dll导入项目中既可使用,使用U3D版本为2019.4,Api Compatibility Level为.net 4.x,安卓打包已测试
--------------------------------2020.9.11--------------------------------
因为java服务器接收的数据一直出错,通过打印得知,C#这边序列化的时候,会把数据长度写入第一位。
通过类似于以下函数,截取掉第一位就可以了
byte[] _b = new byte[bodyBs.Length - 1];
Buffer.BlockCopy(bodyBs, 1, _b, 0, bodyBs.Length - 1);
------------------------------------------------更新序列化与反序列化的方法-----------------------------------------
//序列化对象
public byte[] Serialize<T>(IMessage t)
{
return t.ToByteArray();
}
//反序列化对象
public T Deserialize<T>(byte[] dataBytes) where T : IMessage, new()
{
CodedInputStream stream = new CodedInputStream(dataBytes);
T msg = new T();
msg.MergeFrom(stream);
return msg;
}