我正在开发一个游戏引擎,其中包括一个简单的 GUI 开发工具。GUI 工具允许用户定义各种实体和组件,然后可以将其保存在配置文件中。当游戏引擎运行时加载配置文件时,它可以确定如何创建各种实体和组件以供游戏使用。
对于配置文件保存机制,我使用的是 PyYAML。我遇到的问题源于这样一个事实,即序列化过程发生在一个模块中,该模块与通过 PyYAML 加载和解析文件的模块位于不同的目录中。
简化的串行器
import yaml
def save_config(context, file_name):
config_file = file(file_name, 'w')
# do some various processing on the context dict object
yaml.dump(context, config_file)
config_file.close()
这需要context
对象,这是一个dict
代表各种游戏对象的对象,并将其写入配置文件。这没有问题。
引擎中的简化反序列化器
import yaml
def load(file_name):
config_file = open(file_name, 'r')
context = yaml.load(config_file)
return context
这就是问题发生的地方。在 上yaml.load(config_file)
,我会收到一个错误,因为它无法在某个模块上找到各种名称。我明白为什么会这样。例如,当我序列化配置文件时,它会将一个AssetComponent
(引擎中的组件类型)列为 at engine.common.AssetComponent
。但是,从反序列化器的角度来看,AssetComponent
应该只是 at common.AssetComponent
(因为反序列化代码本身存在于engine
包中),因此无法在engine
.
有没有办法在使用 PyYAML 进行序列化或反序列化时手动处理路径?我想确保它们都是从同一个“角度”发生的。
编辑: 以下显示有问题的配置文件可能是什么样子,然后是手动更正的配置的样子
有问题的
!!python/object/apply:collections.defaultdict
args: [!!python/name:__builtin__.dict '']
dictitems:
assets:
- !!python/object:common.Component
component: !!python/object:engine.common.AssetComponent {file_name: ../content/sticksheet.png,
surface: null}
text: ../content/sticksheet.png
type_name: AssetComponent
已更正
!!python/object/apply:collections.defaultdict
args: [!!python/name:__builtin__.dict '']
dictitems:
assets:
- !!python/object:tools.common.Component
component: !!python/object:common.AssetComponent {file_name: ../content/sticksheet.png,
surface: null}
text: ../content/sticksheet.png
type_name: AssetComponent