繁体   English   中英

用Java重新排列对象(例如,用于Minecraft NBT文件)

[英]Rearranging objects in Java (e.g. for Minecraft NBT files)

这些是对NBT文件的转换工具的一些初步分类。 这是一种提供嵌套对象的文件格式,您可能知道Minecraft的人知道。

因此,让我们考虑一下我们有一个这样的对象:

object.name = String
object.id = int
object.randomInformation = Object
object.storedObjects = Object[]

我要达到的目的是:用户应该能够为对象的不同版本提供配置文件。 可能看起来像这样:

Version1.dat:

someCoolObjectName.id = 1

Version2.dat:

someCoolObjectName.id = 2

因此,从版本1转换为版本2时,程序将读取NBT文件,搜索ID为1的任何对象,将其更改为2并将其写入另一个文件。 到目前为止,没什么大不了的。

当真正涉及版本更改时,问题就开始了。 这包括:

  • 重命名的属性
  • 移动的属性
  • 添加/删除的属性
  • 包含必须被视为“正常”对象本身的对象的属性(如果您进入Minecraft,可能会想到箱子中的物品)

我想到了这样的事情:

Version1.dat:

foo:object.id=1
bar:object.randomInformation
*:object.storedObjects

Version2.dat:

foo:object.id=2
bar:object.usefulInformation
blubb:object.(int)addedInformation
*:object.storedObjects

这意味着从1转换为2:

  • 将ID从1更改为2
  • 将randomInformation重命名为有用的信息
  • 添加一个属性createdInformation,它是一个整数
  • 像普通对象一样转换object.storedObjects中的每个Object
  • 只需复制其他所有属性

这意味着我必须为配置文件实现整个“语言”,并将其转换为必须对每个对象执行的“命令”列表。 有没有更简单的方法可以做到这一点? 还是这已经是一个好主意了?

记住,在每个版本中我都会有很多不同的对象,大多数情况下只需要更改id。 但是在某些通过其ID标识的对象上,必须进行各种更改。 而且我不想更改每个新版本的程序代码。

没那么难! 但是您需要从这两个对象编写转换方法,或者如果第二个对象扩展了第一个对象,则可以简单地复制第一个对象的字段。 如果这些字段不可见,则可以使用反射来复制它们。

对于Minecraft NBT管理,您可以使用JNBT库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM