惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
L
LangChain Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Recent Announcements
Recent Announcements
大猫的无限游戏
大猫的无限游戏
罗磊的独立博客
MongoDB | Blog
MongoDB | Blog
博客园 - 【当耐特】
博客园 - 叶小钗
I
InfoQ
MyScale Blog
MyScale Blog
H
Help Net Security
月光博客
月光博客
Vercel News
Vercel News
B
Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
D
DataBreaches.Net
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
WordPress大学
WordPress大学
GbyAI
GbyAI
Blog — PlanetScale
Blog — PlanetScale
博客园 - Franky

I'm OWenT

国产大模型(GLM 5.1、Kimi K2.6)真实场景效果和 Coding Plan 额度测试 新版本libatapp的连接管理——从etcd服务发现到拓扑驱动的自动重连 新版本libatbus的设计变更——从树形路由到拓扑驱动 Protobuf又一坑 - C++标准和ABI兼容性 AI真好用-给Blog主题统一加mermaid,chart.js,excalidraw,draw.io的多种引入方式支持 给内网部署Squid-通用HTTP下载缓存 UE使用CodeChecker和clang-tidy生成静态分析报告 找出UE的循环依赖 C++小协程栈和临时变量及作用域的栈溢出问题分析 游戏服务的可观测性能力建设(C++生态) 指标上报的多线程优化和多拉取源点优化 协程(libcopp)的Channel功能和CPU命中率优化 通用RPC代码生成器 实现strong_rc_ptr(比shared_ptr更快的引用计数智能指针) 手夯一个STL allocator和对象内存分析组件 std::condition_variable 的信号丢失问题 踩坑一处(GCC)STL std::async 实现BUG导致的crash问题 GCC 14的一个warning to error BUG 给xresloader(Excel导表工具)增强UE读表支持(包含蓝图,Blueprint) Opentelemetry社区在gRPC的几个链接问题(静态库和动态库混用,musl工具链,符号裁剪) Excel转表工具(xresloader)的新验证器(验证外部Excel和文本数据,唯一性和自定义规则) protobuf v22和gRPC v1.55版本升级的依赖变化和upb适配 关于protobuf近期版本(v20/v3.20+)和 gRPC v1.54版本在某些编译环境下的一些链接和编译问题 xresloader-Excel导表工具链的近期变更汇总 打通游戏服务端框架的C++20协程改造的最后一环 Opentelemetry-cpp的Logs模块标准更新(涉及近期版本:1.8-1.9的BREAK CHANGES) 给cmake-toolset和工具链(curl等)加HTTP/2和HTTP/3支持 又开新坑之 coredns 插件: nftables和filter 关于opentelemetry-cpp社区对于C++ Head Only组件单例和符号可见性的讨论小记 填个转表工具 xresloader 去年的坑(数组尾部裁剪)
protobuf-net的动态Message实现
owent · 2017-11-01 · via I'm OWenT

blog-website

这本来是个早就可以写的分享。因为代码几周前就迁移并准备好了。而且这也是之前项目的工具,因为可以抽离出来通用化所以单独整理出来。

这个项目起源于我们之前哪个项目,客户端想要在Unity的C#里动态加载配置,而protobuf-net一方面大量使用反射而性能不太行,另一方面使用的时候得生成C#代码才行。客户端原来的做法是把消息扁平化了,使用protobuf-net得底层读写接口直接操作基本数据类型。这就失去了结构化带来的一系列好处。再加上后来我引入了跨平台导表工具,使用结构化得数据会非常方便,而手动把这个数据打散到客户端读取接口显然很浪费人力而且容易出错。所以我就干脆也使用protobuf-net的底层读写接口做了现在的DynamicMessage的支持,API设计是结合pbc和protobuf官方的API流程的。

其实倒是可以剥离对protobuf-net的支持,因为我用到的底层接口基本上只有wiretype的读写那部分,这部分其实比较容易,无非处理下zigzag编码和varint。这两个我之前也都手写过,其中zigzag编码的原理用于实现以前内存混淆的整数,而varint用于libatbus的流通道传输时一个message开始用于表示整个message长度的header(详见: https://github.com/atframework/libatbus/blob/master/include/detail/buffer.h)。唯一一个比较麻烦的地方是,protobuf打包message的时候是先存长度,再存二进制内容的。那么一开始计算长度的时候就得递归进去计算出所有嵌套结构得长度,这比较麻烦,我也懒得搞,所以就还是用protobuf-net来做这一部分了。

整个结构就是有一个Factory,可以读取pb文件,建立message和enum类型索引。然后根据message得类型来创建、设置、添加和移除field得内容。当时我们没有用到所以没做对pack=true得支持。不过加起来也不困难。另外希望保证稳定性,所以全程没有exception,都是返回错误码然后提供Error Message。Message是会关联到所绑定的Factory的,共享同一份message和enum类型的索引。所以也可以用Message直接创建另一个Message。

最初这个功能就是为了读表使用的。所以写好的工程就放在了xresloader的分组里,而且sample的文件、协议和代码也直接用了xresloader的sample。项目在 https://github.com/xresloader/DynamicMessage-net 里面的ExcelConfig目录是用于xresloader的读表和建立索引的,protobuf-net直接就是原本的protobuf-net。前者不需要可以不要,后者可以直接用其他项目里已有的。

工程配置成了.net standard,在.net framework和.net core里都有单独的sample并且都可以用。