如何保存包含类的Hashmap?

时间:2016-03-23 22:49:00

标签: java bukkit

我在YAML文件中保存和加载hashmap时遇到了麻烦。问题是我的hashmap里面有一个类。

所以这是我的hashmap:

public void onEnable() {

  for(String key : this.getConfig().getKeys(true))  {
      //Getting a red line while trying to convert the string to a clans object!
      Clans value = new Clans(this.getConfig().getString(key));
      Clans.playersClan.put(key, value);

  }
}

public void onDisable() {

    for(Entry<String, Clans> entry : Clans.playersClan.entrySet()){

        this.getConfig().set(entry.getKey(), entry.getValue().toString());

    }
    saveConfig();
}

这是我尝试保存并加载到yamlfile

toString()

我需要帮助解决的错误:

  1. 第15行:我正在尝试使用toString()方法转换我的班级Clans的对象,有些人已经告诉我这是不可能的&lt;用 if("Rolling in 41".equals(rollingTimer )){ // compare with case-sensitive } // OR this way also if("Rolling in 41".equalsIgnoreCase(rollingTimer )){ // compare without case-sensitive } 方法做到这一点。

  2. 第5行我正在尝试将字符串转换为类对象。当然,如果将对象转换为字符串是错误的,那么这也是错误的。除此之外,我也得到一条红线。

  3. 所以,基本上,我需要帮助将字符串转换为类的对象,将类的对象转换为字符串。

    我正在使用bukkit API。

1 个答案:

答案 0 :(得分:0)

当然,您可以将类的实例保存为YAML,方法是将其自身转换为字符串表示形式,但这不会使用您的YAML库。

使用您的库进行混合以转储hashmap并切换到&#34;手动&#34;转储您的Clans个实例将非常难以管理,您需要知道,例如缩进字符串的距离,如何处理数据中的递归引用,复杂的属性等等。这不是正确的方法。

您的实例应该写出标记的YAML映射加载时,标记将指示YAML库重新创建Clans类型实例,并从属性中填充此实例的状态。由于YAML使用锚点和引用支持的可能的递归,这通常在两个步骤中完成。

对于所有实例,YAML需要知道如何转储它们。有些直接映射到YAML原始标量(整数,字符串,布尔值等),其他则直接映射到其数据结构(序列和映射)。您的图书馆可以直接将您的Hashmap映射到YAML映射,而无需您做任何事情(这是您的图书馆设计师的决定)。对于所有其他对象可能需要告诉如何将对象类的实例转储(并加载)到映射,但在这种情况下,您永远不会序列化

E.g。 snakeyamlYamlBeans在他们的示例中显示他们不必被告知如何转储特定类的实例。

如果是这样,通常通过子类化一些特殊的方式来完成如何完成取决于你正在使用的YAML库。

在编写自己的YAML库时,需要帮助将对象转换为字符串和字符串以及对象的唯一原因。根据经验,我可以建议在这之前考虑两次。