socket怎样传输protobuf字节流
发表于:2025-01-17 作者:千家信息网编辑
千家信息网最后更新 2025年01月17日,小编给大家分享一下socket怎样传输protobuf字节流,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!示例 1 ///
千家信息网最后更新 2025年01月17日socket怎样传输protobuf字节流
小编给大家分享一下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字节流"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
序列
对象
消息
内容
工具
篇文章
c#
传输
二进制
代码
位置
函数
数组
类型
一模一样
接下来
上文
不怎么
也就是
参数
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
广州皓也网络技术有限公司
信息数据库定义
云海服务器管理中心上海
软件开发物理模型
域名解析到香港服务器
服务器防dos软件有哪些
多个服务器定时任务调度
计算存储网络安全资源
服务器模组怎么连接
微商云仓模式软件开发中科商务
彩虹六号异种服务器维护即将开始
软件开发设计前置
数据库与数据库之间的差异
铁通ip 服务器
网信云南网络安全吗
百亚互联网科技有限公司
3d像素射击连接至服务器好慢
windows软件开发团队
绍兴知名软件开发
数据库索引方法
dell服务器配置表
云端服务器 微信
阳原软件开发者在线咨询
福建网络技术转让
ios应用软件开发服务公司
银川市软件开发咨询
滨湖区加工软件开发项目信息
关于考研软件开发的创业项目
享骑 服务器
大队开展网络安全检查