使用YamlDotNet进行嵌套字符串到类的反序列化



我需要能够在运行时将字符串(作为属性(动态反序列化为类。我还需要能够以支持嵌套的方式来做到这一点。

示例-发射爆炸子弹的炮塔

Turret.yaml

Type: Turret
Name: MiniTurret
DisplayName: Mini Turret
MaxHP: 100
Damage: 50
TurretTurnSpeed: 20
Sprite: turret_1
ProjectileName: ExplosiveBullet

爆炸性子弹.yaml

Type: Bullet
Name: ExplosiveBullet
DisplayName: Explosive Bullet
Damage: 50
TurretTurnSpeed: 20
Sprite: explosivebullet1
Components:
- ExplosionComp:
- ExplosionType: Incendiary
- Damage: 10
- Radius: 5

我们正试图创建一个炮塔(turret.cs类,如"类型"字段中所述(,用于发射Def名称的炮弹;爆炸性子弹";。在运行时,我们反序列化字符串";爆炸性子弹";进入合适的班级。项目符号现在对组件列表执行相同的操作——它需要反序列化字符串";ExplosionComp;输入ExplosionComp.cs,然后输入"Damage"one_answers"Radius"值。

通过这种方式,我试图创建一个嵌套的组件系统,它可以引用其他组件(例如引用子弹的炮塔,以及引用它被摧毁时引起的爆炸效果的子弹(。

必须使用反射来解决这个问题吗?YamlDotNet中有专门用来处理这个问题的东西吗?

我见过过时或复杂的解决方案;有没有一个好的方法来处理YamlDotNet的这个问题?

YAML 1.2规范包含锚点,允许您在一个地方创建对对象的引用,并在另一个地方使用它们。

然而,该规范也清楚地表明,YAML文件应该彼此完全独立。没有标准的方法可以从另一个文件引用一个文件的内容。

我建议将您的YAML文件读取到数据传输对象层中,在该层中,您可以允许简单的字符串属性仅通过其唯一ID来包含对其他对象的引用。然后,通过将对象引用连接到从具有引用ID的DTO创建的对象,将这些DTO转换到您的对象模型层中。这有点像手动映射过程,但它提供了良好的关注点分离。

最新更新