<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Protobuf on I'm OWenT</title><link>//owent.net/tags/protobuf.html</link><description>Recent content in Protobuf on I'm OWenT</description><generator>Hugo</generator><language>zh-cn</language><copyright>&lt;a rel="license" href="https://github.com/owent/blog-hugo/blob/master/LICENSE.md"&gt;&lt;img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/80x15.png" /&gt;&lt;/a&gt;</copyright><lastBuildDate>Fri, 27 Mar 2026 16:08:45 +0000</lastBuildDate><atom:link href="//owent.net/tags/protobuf/index.xml" rel="self" type="application/rss+xml"/><item><title>新版本libatbus的设计变更——从树形路由到拓扑驱动</title><link>//owent.net/2026/2604.html</link><pubDate>Fri, 27 Mar 2026 16:08:45 +0000</pubDate><guid>//owent.net/2026/2604.html</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;&#10;&lt;p&gt;很久很久以前，我为了解决以前项目中bus通信膨胀的问题设计了 &lt;a href="https://github.com/atframework/libatbus"&gt;libatbus&lt;/a&gt;, 当时主要解决的核心问题是解决大量服务器节点互通时服务器间两两建立通道时的大量内存浪费问题。也同时使用跨进程的无锁队列避免了多写单读场景下的加锁以提高性能。&lt;/p&gt;</description></item><item><title>Protobuf又一坑 - C++标准和ABI兼容性</title><link>//owent.net/2026/2603.html</link><pubDate>Sun, 11 Jan 2026 01:15:45 +0000</pubDate><guid>//owent.net/2026/2603.html</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;&#10;&lt;p&gt;前段时间例行升级我为游戏框架写的构建系统 &lt;a href="https://github.com/atframework/cmake-toolset"&gt;cmake-toolset&lt;/a&gt; 时，又遇到了 &lt;a href="https://github.com/protocolbuffers/protobuf"&gt;protobuf&lt;/a&gt; 的一个新 ABI 兼容性问题。&lt;/p&gt;&#10;&lt;p&gt;这已经不是第一次被 &lt;a href="https://github.com/protocolbuffers/protobuf"&gt;protobuf&lt;/a&gt; 的 ABI 兼容性问题“教育”了。这篇把问题拆开讲清楚，并给出一套可落地的规避方案，供遇到类似问题的同学参考。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;编译环境：Windows + Visual Studio 2026&lt;/li&gt;&#10;&lt;li&gt;Abseil-Cpp：20250512.1&lt;/li&gt;&#10;&lt;li&gt;Protobuf：v31.1（看起来目前最新的 v33.1 也有这个问题）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="现象与错误定位"&gt;现象与错误定位&lt;/h2&gt;&#10;&lt;p&gt;首先在链接阶段出现错误：&lt;/p&gt;</description></item><item><title>protobuf v22和gRPC v1.55版本升级的依赖变化和upb适配</title><link>//owent.net/2023/2306.html</link><pubDate>Sat, 17 Jun 2023 17:01:45 +0000</pubDate><guid>//owent.net/2023/2306.html</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;&#10;&lt;p&gt;近期的 &lt;a href="https://github.com/protocolbuffers/protobuf"&gt;protobuf&lt;/a&gt; v22和 &lt;a href="https://github.com/grpc/grpc"&gt;gRPC&lt;/a&gt; v1.55 版本在构建流程层面引入了一些比较大的变化。&#10;最初我关注到这个问题是在我参与的一个社区项目 &lt;a href="https://github.com/open-telemetry/opentelemetry-cpp"&gt;opentelemetry-cpp&lt;/a&gt; 的issue中（ &lt;a href="https://github.com/open-telemetry/opentelemetry-cpp/issues/2095"&gt;https://github.com/open-telemetry/opentelemetry-cpp/issues/2095&lt;/a&gt; ）。&#10;直到后来，我们在自己的构建系统 &lt;a href="https://github.com/atframework/cmake-toolset"&gt;cmake-toolset&lt;/a&gt; 对 &lt;a href="https://github.com/protocolbuffers/protobuf"&gt;protobuf&lt;/a&gt; 和 &lt;a href="https://github.com/grpc/grpc"&gt;gRPC&lt;/a&gt; 也进行了升级。所以顺带给社区的项目也提交了一些相关的Patch，在这里分享一下可能其他同学也会碰到。&lt;/p&gt;</description></item><item><title>关于protobuf近期版本（v20/v3.20+）和 gRPC v1.54版本在某些编译环境下的一些链接和编译问题</title><link>//owent.net/2023/2305.html</link><pubDate>Fri, 16 Jun 2023 22:25:45 +0000</pubDate><guid>//owent.net/2023/2305.html</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;&#10;&lt;p&gt;年初的时候我们项目组的构建系统( &lt;a href="https://github.com/atframework/cmake-toolset"&gt;cmake-toolset&lt;/a&gt; )里把 &lt;a href="https://github.com/protocolbuffers/protobuf"&gt;protobuf&lt;/a&gt; 升级到了 v20/v3.20 版本, &lt;a href="https://github.com/grpc/grpc"&gt;gRPC&lt;/a&gt; 也升级到了 v1.54 版本。然而这两个版本在Linux的ELF ABI和MacOS的Macho ABI下都出现了一些符号未定义的问题（当然也包含Android和iOS）。&#10;这些问题也不仅限于 &lt;a href="https://github.com/protocolbuffers/protobuf"&gt;protobuf&lt;/a&gt; v20/v3.20 和 &lt;a href="https://github.com/grpc/grpc"&gt;gRPC&lt;/a&gt; v1.54，后续的版本有些修复了，有些没有。在官方完全修复之前，我们自己打了一些patch去修复这些问题。&lt;/p&gt;</description></item><item><title>xresloader-Excel导表工具链的近期变更汇总</title><link>//owent.net/2023/2304.html</link><pubDate>Tue, 18 Apr 2023 20:27:45 +0000</pubDate><guid>//owent.net/2023/2304.html</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://xresloader.atframe.work/"&gt;xresloader&lt;/a&gt; 是一组用于把Excel数据结构化并导出为程序可读的数据文件的导表工具集。它包含了一系列跨平台的工具、协议描述和数据读取代码。&lt;/p&gt;&#10;&lt;p&gt;主要功能特点：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;跨平台（java 11 or upper）&lt;/li&gt;&#10;&lt;li&gt;Excel =&amp;gt; protobuf/msgpack/lua/javascript/json/xml&lt;/li&gt;&#10;&lt;li&gt;完整支持协议结构，包括嵌套结构和数组嵌套&lt;/li&gt;&#10;&lt;li&gt;同时支持protobuf proto v2 和 proto v3&lt;/li&gt;&#10;&lt;li&gt;支持导出proto枚举值到lua/javascript代码和json/xml数据&lt;/li&gt;&#10;&lt;li&gt;支持导出proto描述信息值到lua/javascript代码和json/xml数据（支持自定义插件，方便用户根据proto描述自定义反射功能）&lt;/li&gt;&#10;&lt;li&gt;支持导出 UnrealEngine 支持的json或csv格式，支持自动生成和导出 UnrealEngine 的 &lt;code&gt;DataTable&lt;/code&gt; 加载代码&lt;/li&gt;&#10;&lt;li&gt;支持别名表，用于给数据内容使用一个易读的名字&lt;/li&gt;&#10;&lt;li&gt;支持验证器，可以在数据里直接填写proto字段名或枚举名，或者验证填入数据的是否有效&lt;/li&gt;&#10;&lt;li&gt;支持通过protobuf协议插件控制部分输出&lt;/li&gt;&#10;&lt;li&gt;支持自动合表，把多个Excel数据表合并成一个输出文件&lt;/li&gt;&#10;&lt;li&gt;支持公式&lt;/li&gt;&#10;&lt;li&gt;支持oneof,支持plain模式输入字符串转为数组或复杂结构,支持map&lt;/li&gt;&#10;&lt;li&gt;支持空数据压缩（裁剪）或保留定长数组&lt;/li&gt;&#10;&lt;li&gt;支持基于正则表达式分词的字段名映射转换规则&lt;/li&gt;&#10;&lt;li&gt;支持设置数据版本号&lt;/li&gt;&#10;&lt;li&gt;Lua输出支持全局导出或导出为 &lt;code&gt;require&lt;/code&gt; 模块或导出为 &lt;code&gt;module&lt;/code&gt; 模块。&lt;/li&gt;&#10;&lt;li&gt;Javascript输出支持全局导出或导出为 &lt;code&gt;nodejs&lt;/code&gt; 模块或导出为 &lt;code&gt;AMD&lt;/code&gt; 模块。&lt;/li&gt;&#10;&lt;li&gt;提供CLI批量转换工具（支持python 2.7/python 3 @ Windows、macOS、Linux）&lt;/li&gt;&#10;&lt;li&gt;提供GUI批量转换工具（支持Windows、macOS、Linux）&lt;/li&gt;&#10;&lt;li&gt;CLI/GUI批量转换工具支持include来实现配置复用&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;a href="https://xresloader.atframe.work/"&gt;xresloader&lt;/a&gt; 包含了多个组件，其中最主要的部分分别是。&lt;/p&gt;</description></item><item><title>填个转表工具 xresloader 去年的坑（数组尾部裁剪）</title><link>//owent.net/2022/2208.html</link><pubDate>Sat, 27 Aug 2022 20:59:45 +0000</pubDate><guid>//owent.net/2022/2208.html</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/xresloader/xresloader"&gt;xresloader&lt;/a&gt; 是一个功能比较全面并且跨平台的Excel导出protobuf、msgpack、xml、lua、json、javascript、UE-Csv、UE-Json等数据格式的工具。&#10;并且整个工具链还包含了基于模板引起生成读表代码的 &lt;a href="https://github.com/xresloader/xres-code-generator"&gt;xres-code-generator&lt;/a&gt; ，方便产品/策划使用的 &lt;a href="https://github.com/xresloader/xresconv-gui"&gt;GUI批量执行工具 - xresconv-gui&lt;/a&gt; 和方便CI集成和程序使用的 &lt;a href="https://github.com/xresloader/xresconv-cli"&gt;命令行批量执行工具 - xresconv-cli&lt;/a&gt;。&lt;/p&gt;</description></item><item><title>集成 upb 和 lua binding 的踩坑小记</title><link>//owent.net/2022/2207.html</link><pubDate>Sat, 20 Aug 2022 17:59:45 +0000</pubDate><guid>//owent.net/2022/2207.html</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;&#10;&lt;p&gt;最近新项目重新评估了一下protobuf的C/C++ -&amp;gt; Lua binding 方案。之前，使用最广泛的 Lua binding 方案应该是 &lt;a href="https://blog.codingnow.com/"&gt;云风&lt;/a&gt; 的 &lt;a href="https://github.com/cloudwu/pbc"&gt;pbc&lt;/a&gt; 。但是这个库已经是作者弃坑好多年的状态了。我之前使用 &lt;a href="https://github.com/cloudwu/pbc"&gt;pbc&lt;/a&gt; 的时候刚碰上 protobuf 3.0 刚出来，当时打了patch来适配 protobuf 3.0 ，还修复了一些其他问题。这个Patch有些推给了上游，有些因为和上游的某些机制冲突没有推。我了解到的很多其他项目也或多或少的打了自己的Patch，大多数也没往上游推。基本上 &lt;a href="https://github.com/cloudwu/pbc"&gt;pbc&lt;/a&gt; 已经处于一个失维的状态，所以这次新项目就干脆来寻求更好，或者说仍然有良好活跃度的解决方案。于是就看向了 &lt;a href="https://github.com/protocolbuffers/upb"&gt;upb&lt;/a&gt; 。&lt;/p&gt;</description></item><item><title>C++20 Text Formatting/fmtlib 适配问题小记</title><link>//owent.net/2021/2108.html</link><pubDate>Sun, 05 Sep 2021 15:48:54 +0000</pubDate><guid>//owent.net/2021/2108.html</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;&#10;&lt;p&gt;C++20 正式发布已经有一段时间了。其中 &lt;code&gt;Text Formatting&lt;/code&gt; 是一个我个人比较感兴趣的新组件。它主要是解决了之前字符串格式化库 ( &lt;code&gt;printf&lt;/code&gt; 系 ) 的效率问题和运行时安全的问题。&#10;并且新的格式设置的形式也比较友好。相关规范和用法可以参见:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0645r10.html#format.formatter"&gt;http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0645r10.html#format.formatter&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2216r3.html"&gt;http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2216r3.html&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://en.cppreference.com/w/cpp/utility/format"&gt;https://en.cppreference.com/w/cpp/utility/format&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;在C++ 20能够普及以前，我们可以用 &lt;a href="https://fmt.dev/"&gt;fmtlib&lt;/a&gt; 这个库来完成一样的功能。实际上我们项目组已经在这么做了。在使用 &lt;a href="https://fmt.dev/"&gt;fmtlib&lt;/a&gt; 之前，比如我们按玩家打日志大概是这种形式。&lt;/p&gt;</description></item><item><title>基于protobuf的代码生成</title><link>//owent.net/2021/2101.html</link><pubDate>Tue, 09 Feb 2021 11:39:45 +0000</pubDate><guid>//owent.net/2021/2101.html</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;&#10;&lt;p&gt;前段时间我用 &lt;a href="https://www.python.org/"&gt;Python&lt;/a&gt; 和 &lt;a href="https://www.makotemplates.org/"&gt;Mako&lt;/a&gt; 模板引擎重新梳理了我们项目中的一些重复的流程。重构了所有的RPC系统。这个工作其实完成了挺久了，但是迫于懒一直拖着没写完这篇记录，就一直没发。&lt;/p&gt;&#10;&lt;p&gt;使用代码生成工具实现RPC模块还是比较有成效的事情，有助于统一API接口，也有利于部分组件模块化，修改和重构内部实现也会比较方便。业内已有的代码生成实现也比较多，但是多是针对特定系统和框架实现的，如果要接入其他框架或者说接入多种SDK的流程并不是很方便。我这次的实现一方面是针对我们内部的服务提供类似很多RPC系统也提供的内部接口、实现和注册流程的标准化，另一方面也是尽可能灵活且通用一些，可以用于接入外部的SDK。&lt;/p&gt;</description></item><item><title>几个使用protobuf中C++接口的Arena的坑</title><link>//owent.net/2020/2009.html</link><pubDate>Tue, 10 Nov 2020 16:35:33 +0000</pubDate><guid>//owent.net/2020/2009.html</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/protocolbuffers/protobuf"&gt;protobuf&lt;/a&gt; 从3.0版本开始对C++增加了Arena接口，可以用于使用连续的内存块分配内部对象，并且可以更容易精确地控制对象地生命周期，最终达到减少内存碎片地目的。最近我给我们项目的部分接口流程进行相关地改造，在大多数使用 &lt;a href="https://github.com/protocolbuffers/protobuf"&gt;protobuf&lt;/a&gt; 的地方都增加了对Arena的支持，但是在接入过程中也碰到了一些问题和坑。&lt;/p&gt;</description></item><item><title>xresloader转表工具链增加了一些新功能(map,oneof支持，输出矩阵，基于模板引擎的加载代码生成等)</title><link>//owent.net/2020/2006.html</link><pubDate>Sat, 29 Aug 2020 14:07:45 +0000</pubDate><guid>//owent.net/2020/2006.html</guid><description>&lt;p&gt;&lt;a href="https://github.com/xresloader/xresloader"&gt;xresloader&lt;/a&gt; 是一组用于把Excel数据结构化并导出为程序可读的数据文件的导表工具集。它包含了一系列跨平台的工具、协议描述和数据读取代码。支持把Excel配置输出成 protobuf二进制、xml、json、lua、javascript、nodejs、msgpack、&lt;a href="https://www.unrealengine.com/"&gt;UE&lt;/a&gt;的Json格式及支持蓝图的代码、&lt;a href="https://www.unrealengine.com/"&gt;UE&lt;/a&gt;的Csv格式及支持蓝图的代码。&lt;/p&gt;</description></item><item><title>protobuf、flatbuffer、msgpack 针对小数据包的简单对比</title><link>//owent.net/2019/1908.html</link><pubDate>Sat, 03 Aug 2019 10:59:58 +0000</pubDate><guid>//owent.net/2019/1908.html</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;&#10;&lt;p&gt;前段时间我尝试给 &lt;a href="https://github.com/atframework/"&gt;atframework&lt;/a&gt; 的 &lt;a href="https://github.com/atframework/libatapp"&gt;libatapp&lt;/a&gt; 整合进UnrealEngine做Dedicated Server和逻辑server通信的时候碰到了一些问题。主要在于这些客户端引擎一般来说默认都是关闭exception的甚至会关闭RTTI。而 &lt;a href="https://github.com/atframework/libatapp"&gt;libatapp&lt;/a&gt; 所依赖的通信组件 &lt;a href="https://github.com/atframework/libatbus"&gt;libatbus&lt;/a&gt; 里内部协议是&lt;a href="https://msgpack.org/"&gt;msgpack&lt;/a&gt; ， 而 &lt;a href="https://msgpack.org/"&gt;msgpack&lt;/a&gt; 的官方 C++ 的header only的实现是必须开异常的功能的。所以我近期打算抽空增强一波 &lt;a href="https://github.com/atframework/libatbus"&gt;libatbus&lt;/a&gt; 的功能，增加一些跨版本向前向后兼容功能，和一些简单的验证功能（仅仅是为了防止误操作导致的问题）。具体的变更等我弄完了再发一篇。&lt;/p&gt;</description></item><item><title>Excel转表工具(xresloader) 增加protobuf插件功能和集成 UnrealEngine 支持</title><link>//owent.net/2019/1906.html</link><pubDate>Sat, 08 Jun 2019 12:47:58 +0000</pubDate><guid>//owent.net/2019/1906.html</guid><description>&lt;h1 id="前言"&gt;前言&lt;/h1&gt;&#10;&lt;p&gt;我们项目组最近在学习UE，然后就涉及导表这个东东。之前我已经做过一个功能比较全面并且跨平台的Excel导出protobuf、msgpack、xml、lua、json、javascript等的工具 &lt;a href="http://github.com/xresloader/"&gt;xresloader&lt;/a&gt; 。并且做了方便服务器集成的CLI工具和方便策划、前端用的GUI工具。那么这次很自然地就让它能够导出UE所支持的内容就行了。然后额外增加了基于protobuf插件形式的多key索引和自动生成一些支持蓝图和非蓝图的常用接口代码。&lt;/p&gt;</description></item><item><title>pbc的一个陈年老BUG</title><link>//owent.net/2016/1273.html</link><pubDate>Mon, 04 Jul 2016 13:01:42 +0000</pubDate><guid>//owent.net/2016/1273.html</guid><description>&lt;p&gt;近期跟了一下pbc的lua-binding的一个老BUG，起源是我们客户端报了一个奇怪的问题，我们游戏里的某些功能的optional字段，服务器并没有下发数据，但是客户端竟然能读到。&lt;/p&gt;&#10;&lt;p&gt;一开始我去issues里翻，翻到了个这个， &lt;a href="https://github.com/cloudwu/pbc/issues/27"&gt;https://github.com/cloudwu/pbc/issues/27&lt;/a&gt; 。&#10;这是2014年就发现的BUG了，然而云风说考虑到性能问题不想改。大事我觉得吧，就算一些性能损失，也好过容易出BUG，并且协议打解包在游戏中的CPU占用本身就不重。所以这能自己动手，丰衣足食喽。&lt;/p&gt;</description></item><item><title>理解Protobuf的数据编码规则</title><link>//owent.net/2012/595.html</link><pubDate>Thu, 31 May 2012 02:18:17 +0000</pubDate><guid>//owent.net/2012/595.html</guid><description>&lt;!-- toc --&gt;&#13;&#10;&lt;p&gt;之前用Google的Protobuf感觉真是个很好用的东西，于是抽时间研究了下他的数据的存储方式，以后可以扩展其他语言的解析器。其实与其说是研究，不如说是翻译。这些文档里都有，可能有些地方理解的不太对，还请见谅。&lt;/p&gt;</description></item></channel></rss>