Google.Protobuf在U3D中的序列化与反序列化

关于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;
        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值