socket怎样传输protobuf字节流
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,小编给大家分享一下socket怎样传输protobuf字节流,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!示例 1 ///
千家信息网最后更新 2026年11月01日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安全错误
数据库的锁怎样保障安全
互联网科技有限公司
盈实互联网科技
互联网公司 科技公司
互联网科技英文
万易互联网科技有限公司
互联网科技上市公司
长亮科技互联网金融
互联网金融科技委员会
重庆科技学院互联网
居家互联网科技有限公司
山东吉时兔互联网科技有限公司
开启互联网科技时代小说
银川新华互联网科技职业技术培训学校图片
滨湖区互联网智能科技产品有哪些
2021互联网科技公司排名
雨阳互联网卡科技有限公司
国产互联网科技公司
长沙易易互联网科技有限公司
互联网企业和网络科技有限公司
互联网科技自媒体灵感
互联网 科技
广州凡科互联网科技
互联网科技汛
互联网科技宣传片
恒生科技互联网指数分析
广州慧亚互联网科技怎么样
燊美集互联网科技有限公司
科技互联网海报
半导体是互联网高科技吗
青岛易易互联网科技