FAQ =============== 哪里有完整的示例? ------------------------------------------------------------------------------------------------------- 转表功能和二进制数据读取的示例见: https://github.com/xresloader/xresloader/tree/main/sample 文本和Msgpack数据读取示例见: https://github.com/xresloader/xresloader/tree/main/loader-binding 批量转表配置的示例见: https://github.com/xresloader/xresconv-conf 为什么会读到很多空数据? ------------------------------------------------------------------------------------------------------- Excel里编辑过的单元格即便删除了也会留下不可见的样式配置,这时候会导致转出的数据有空行。可以通过在Excel里删除行解决 为什么Excel里填的时间,但是转出来是一个负数? ------------------------------------------------------------------------------------------------------- Excel里的日期时间类型转成协议里整数时会转为Unix时间戳,但是Excel的时间是以1900年1月0号为基准的,这意味着如果时间格式是 ``hh:mm:ss`` 的话,``49:30:01`` 会被转为 ``1900-1-2 1:31:01`` 。 时间戳因为是相对于 ``1970-01-01 00:00:00`` 的秒数,所以会是一个绝对值很大的负数。 Windows下控制台里执行执行会报文件编码错误?(java.nio.charset.UnsupportedCharsetException: cp65001) ------------------------------------------------------------------------------------------------------- 这个问题涉及的几个Exception是: .. code-block:: bash ERROR StatusLogger Unable to inject fields into builder class for plugin type class org.apache.logging.log4j.core.appender.ConsoleAppender, element Console. java.nio.charset.UnsupportedCharsetException: cp65001 at java.nio.charset.Charset.forName(Unknown Source) at org.apache.logging.log4j.util.PropertiesUtil.getCharsetProperty(PropertiesUtil.java:146) at org.apache.logging.log4j.util.PropertiesUtil.getCharsetProperty(PropertiesUtil.java:134) ... ... 和 .. code-block:: bash ERROR StatusLogger Unable to invoke factory method in class class org.apache.logging.log4j.core.appender.ConsoleAppender for element Console. java.lang.IllegalStateException: No factory method found for class org.apache.logging.log4j.core.appender.ConsoleAppender at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.findFactoryMethod(PluginBuilder.java:224) at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:130) at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:952) ... ... 这是因为在Windows控制台中,如果编码是UTF-8,java获取编码时会获取到cp65001,而这个编码java本身是不识别的。这种情况可以按下面的方法解决: + 第一种: 执行xresloader之前先执行 chcp 936,切换到GBK编码 + 第二种: 在powershell里执行 C++加载代码编译时出现xresloader符号重定义(multiple definition of ``org::xresloader::pb::xresloader_XXX)`` --------------------------------------------------------------------------------------------------------------------- pb_header.pb.cc 和 pb_header_v3.pb.cc 只能保留一个 如果系统采用的是proto v3则保留pb_header_v3.pb.cc 如果系统采用的是老版本的proto v2则保留pb_header.pb.cc C++加载代码编译时出现xresloader版本检查错误 ---------------------------------------------------------------------------------------------------------------- 具体表现为编译时输出 ``This file was generated by an older version of protoc ...`` 或 ``This file was generated by a newer version of protoc ...`` 。 这是因为protoc版本和目前所用的protobuf版本不一致,请尝试重新用目前所用的protoc根据配置的proto文件和header目录中的 ``pb_header_v3.proto`` 或 ``pb_header.proto`` 重新生成c++代码文件。 proto v2版本API解析repeated的整数或浮点数类型字段失败(Wire Type) ---------------------------------------------------------------------------------------------------------------- 我们转表默认使用的是proto v3模式,几乎所有编码规则都是向前兼容到proto v2的,但是也有一个例外,就是repeated的数值类型。 repeated的数值类型在proto v2里默认是 ``[ packed = false ]`` 而在proto v3里是 ``[ packed = true ]`` 。解决方法是显式指定打包方式。 详见 :ref:`output-format-proto v2 and proto v3` 。 为什么在proto里定义的是一个无符号(unsigned)类型(uint32、uint64等),实际输出的UE代码是有符号(signed)的(int32/int64)? ---------------------------------------------------------------------------------------------------------------------------- 因为有一些语言是没有无符号(unsigned)类型的,为了统一数据类型,我们统一转换为有符号类型,转换方式和protobuf的java版SDK保持一致。如果需要使用大于int32最大值的uint32类型,请用int64代替。 为什么 ``UE-Csv`` 和 ``UE-Json`` 输出的代码会多一个 ``Name`` 字段? ---------------------------------------------------------------------------------------------------------------- 因为对 ``UE-Json`` 输出中, ``Name`` 是一个特殊字段,也用于UE中内置的接口的查找索引。所以为了统一输出的数据结构( 这样无论是 ``UE-Csv`` 还是 ``UE-Json`` 都可以用相同的代码结构来导入 ),我们对 ``UE-Csv`` 和 ``UE-Json`` 统一自动生成 ``Name`` 字段。但是如果用户自定义了 ``Name`` 字段, 我们会使用用户自定义的 ``Name`` 字段。 要如何配置可以让Excel里的数据指向UE的类型或资源 ---------------------------------------------------------------------------------------------------------------- 可以使用 ``org.xresloader.ue.ue_type_name`` 插件和 ``org.xresloader.ue.ue_type_is_class`` 插件。详见: :ref:`output-format-export ue` 为什么UE的代码输出里对 ``oneof`` 的case输出使用 ``FString`` 的字段名而不使用 ``UEnum()`` ---------------------------------------------------------------------------------------------------------------- 主要是因为(当前版本4.X)UE的 ``UEnum()`` 的支持仅支持基于 ``uint8`` 的,但是protobuf的field number是 ``int32`` 。为了兼容性所以没有使用 ``UEnum()`` 。 如果输出int32的话在UE里不太好操作,所以输出了字符串类型,方便蓝图里或UE代码里通过UE内置的反射机制访问。 提示 ``Can not reserve enough space for XXX objecct heap`` ---------------------------------------------------------------------------------------------------------------- 在转换很大的Excel文件时(上万行数据),会需要很高的内存(>=1GB)。所以为了方便我们在批量转表sample的xml中配置了 ``-Xmx2048m`` 。 如果出现这个提示可能是32位jre无法分配这么多地址空间导致的,可以在xml里删除这个配置。但是还是建议使用64位jre。 在 v2.10.0 版本以后,可以通过使用 ``--disable-excel-formular`` 关闭公式实时计算,这时候会使用内部的索引器,能够大幅降低内存和CPU开销。 > 关闭公式实时计算并不是指不支持公式。Excel在保存时会保存一份公式计算结果的缓存,关闭公式实时计算后会使用这个缓存。