小编给大家分享一下socket怎样传输protobuf字节流,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
公司主营业务:网站设计制作、网站设计、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出藁城免费做网站回馈大家。
示例
1 ///2 /// 将消息序列化为二进制的方法 3 /// 4 /// 要序列化的对象 5 public static byte[] Serialize(IExtensible model) 6 { 7 try 8 { 9 //创建流对象10 MemoryStream ms = new MemoryStream()11 //使用ProtoBuf自带的序列化工具序列化IExtensible对象12 Serializer.Serialize(ms, model);13 //创建二级制数组,保存序列化后的流14 byte[] bytes = new byte[ms.Length];15 //将流的位置设为016 ms.Position = 0;17 //将流中的内容读取到二进制数组中18 ms.Read(bytes, 0, bytes.Length);19 return bytes;20 }21 catch (Exception e)22 {23 Debug.Log("序列化失败: " + e.ToString());24 return null;25 }26 }
protobuf文件中的每一条message经过protocol buffer提供的ProtoGen工具可以转成c#的中的类,例如
message Test { required string test1= 1; required string test2= 2; }
经过转化后就变成了
1 [global::System.Serializable, global::ProtoBuf.ProtoContract(Name=@"SedReq")] 2 public partial class Test : global::ProtoBuf.IExtensible 3 { 4 public Test() {} 5 6 private string _test1; 7 [global::ProtoBuf.ProtoMember(1, IsRequired = true, Name=@"test1", DataFormat = global::ProtoBuf.DataFormat.Default)] 8 public string test1 9 {10 get { return _test1; }11 set { _test1 = value; }12 } 13 private string _test2;14 [global::ProtoBuf.ProtoMember(2, IsRequired = true, Name=@"test2", DataFormat = global::ProtoBuf.DataFormat.Default)]15 public string test216 {17 get { return _test2; }18 set { _test2 = value; }19 }20 private global::ProtoBuf.IExtension extensionObject;21 global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)22 { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }23 }
无视所有带global的代码,你会发现,转化后的c#类和一个标准的c#实体类一模一样,并且,这些转化后的类都继承至ProtoBuf.IExtensible,所以上文中的序列化函数的参数的类型是IExtensible
有了序列化,当然还需要反序列化,也就是讲byte[]反序列化为继承至IExtensible的类型的对象
1 ///2 /// 将收到的消息反序列化成IExtensible对象 3 /// 4 /// 收到的消息的字节流. 5 ///6 public static T DeSerialize (byte[] bytes) where T : IExtensible 7 { 8 try 9 {10 MemoryStream ms = new MemoryStream()11 //将消息写入流中12 ms.Write(bytes, 0, bytes.Length);13 //将流的位置归014 ms.Position = 0;15 //反序列化对象16 T result = Serializer.Deserialize (ms);17 return result;18 }19 catch (Exception e)20 {21 Debug.Log("反序列化失败: " + e.ToString());22 return null;23 }24 }
因为反序列化后的对象是继承至IExtensible的类的对象,所以返回值必须使用泛型约束来定义,这样才能保证函数的通用性
工具搞定,接下来就是测试代码了
1 public void Test()2 {3 Test test = new Test() { test1 = "123", test2 = "456" };4 byte[] bytes = Serialize(test);5 Test test2 = DeSerialize(bytes);6 Debug.Log(test2.test1 + test2.test2);7 }
输出结果 123456
以上是“socket怎样传输protobuf字节流”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款