obsidian/笔记文件/2.笔记/Protobuf序列化_第一章.md
2025-03-26 00:02:56 +08:00

4.8 KiB
Raw Permalink Blame History

定义参考Protobuf通信协议即可; 如果要使用Protobuf通信协议需要先用到对应的程序集 在微软的官方NuGet软件包平台就可以下载使用 右键,测试工程

!Pasted image 20240418133310.png

可以看到是有下载和安装了对应的软件包也隐式安装了与之对应的Core核心库

!Pasted image 20240418133327.png

unity客户端同理也是集成了对应的软件包dll程序集

!Pasted image 20240418133414.png

测试工程先弄一个Person协议类需要加上ProtoContract标签其中也会加上ProtoMember和tag数字索引标识协议包含的数据

!Pasted image 20240418133456.png

再弄一个Address地址相关的协议类也是加上ProtoContract和ProtoMember标签而且嵌套在Person协议类里 不管是哪个协议类都需要加上Serializable标签标识可序列化

!Pasted image 20240418133653.png

使用原生的Serialize序列化接口对Person协议类进行序列化

!Pasted image 20240418133955.png

与之对应的,原生,解序列化函数接口

!Pasted image 20240418134054.png

调用原生序列化、解序列化的TestBasicNormal函数接口完成Person和Address协议类的构建后序列化person到data字节数组再直接DeSerialize解序列化变回Person打印其中的字段

!Pasted image 20240418142236.png

Main函数调用运行log正常

!Pasted image 20240418142433.png

!Pasted image 20240418142444.png

!Pasted image 20240418142506.png

TestBasicPB函数接口是用来测试Protobuf的最开始也是完成Person和Address协议类的构建然后调用Protobuf内部的Serializer逻辑对应的Serialize序列化、Deserialize解序列化接口 然后也是打印log信息

!Pasted image 20240418142640.png

!Pasted image 20240418142848.png

继续测试创建一个person.bytes字节文件序列化写入然后解序列化读取打印log

!Pasted image 20240418142924.png

主函数调用打印log正常

!Pasted image 20240418143009.png

!Pasted image 20240418143035.png

测试使用的是UDP网络通信与之对应的协议类其中CMD枚举是用于通信的Head头部标识包含 LogicLogin登录相关、BagInfo背包相关 还有一个Error枚举是用于错误码的逻辑处理

!Pasted image 20240418150003.png

背包协议对应的ReqBagInfo请求、RspBagInfo接收其中背包结构BagItem

!Pasted image 20240418153401.png

登录协议ReqLogicLogin请求有acct账号、pass密码结构RspLogicLogin接收对应UserData用户数据结构为uid、name名字、level等级、exp经验

!Pasted image 20240418153545.png

还有俩测试连接的请求接收分别是ReqXXXOOO、RspXXXOOO 消息主体是Body结构包含上述解析的协议结构

!Pasted image 20240418153754.png

Head是头部包含CMD协议标识的枚举而Pkg就是头部 + 消息主体,的网络消息包

!Pasted image 20240418153919.png

常规的Serialize序列化、DeSerialize解序列化工具接口

!Pasted image 20240418154108.png

!Pasted image 20240418154137.png

UDP跟TCP不一样的地方其中一点是Socket连接上没有很明确的客户端和服务端的区分

!Pasted image 20240418155311.png

服务端的ReqLogin登录请求响应逻辑打印消息主体Body的acct账号、pass密码信息 然后构建一个Body消息主体再调用服务端根逻辑ServerRoot的SendMsg函数接口完成消息回发

!Pasted image 20240418155428.png

SendMsg函数接口对应的具体逻辑就是构建Pkg消息包使用常规的Serialize序列化工具得到字节数组通过udp发送即可

!Pasted image 20240418155642.png

服务端的背包ReqBagInfo请求响应也是在打印log之后构建背包RspBagInfo回包对应的Body消息主体也是调用SendMsg函数接口发回给客户端即可

!Pasted image 20240418155752.png

服务端逻辑根节点声明了udp端、还有登录login和背包bag对应协议的Handler事件逻辑 弄一个Instance单例

!Pasted image 20240418160004.png

ServerRecive函数接口使用await异步接收udp网络消息然后调用常规的DeSerialize 解序列化工具; switch消息包的head头部cmd枚举对应的协议类型调用 登录相关loginHandler 或 背包相关 bagHandler 的响应逻辑即可;

!Pasted image 20240418160133.png

根逻辑点对应的Init初始化就是各个Handler的实例化对象再开一个udp连接使用Task创建一个ServerRecive接收消息的任务即可

!Pasted image 20240418160435.png

对应的Main主函数调用Init初始化开启服务器

!Pasted image 20240418160651.png