【问题标题】:Trying to store Bukkit ItemStack field to a file but ItemStack is not Serrializable尝试将 Bukkit ItemStack 字段存储到文件但 ItemStack 不可序列化
【发布时间】:2017-06-09 08:06:56
【问题描述】:

ItemStack 不可序列化,我正在尝试将带有 ItemStack 字段的名为 Objective 的对象保存到文件中,但由于 ItemStack 不可序列化,因此这不起作用。我尝试扩展 ItemStack 并实现 Serializable 并将字段更改为我的新可序列化子类,但这也不起作用。以下是我原始代码的相关部分:

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;

import org.bukkit.inventory.ItemStack;

public class Objective implements Serializable {

private static final long serialVersionUID = -2018456670240873538L;

private static ArrayList<Requirement> requirements = new ArrayList<>();

private String name;
private Requirement requirement;
private ItemStack reward;

private int tillComplete;

private boolean complete;

public Objective(String name, int requirementIndex, int tillComplete, ItemStack reward) {

    if(requirements.isEmpty()) {
        requirements.add(Requirement.kill_Skeletons);
        requirements.add(Requirement.kill_Spiders);
        requirements.add(Requirement.kill_Zombies);
    }


    this.name = name;
    this.requirement = requirements.get(requirementIndex);
    this.tillComplete = tillComplete;
    this.reward = reward;
    complete = false;
}

public String getName() {
    return name;
}

public Object getRequirement() {
    return requirement;
}

public static ArrayList<Requirement> getRequirements() {
    return requirements;
}

public static void setRequirements(ArrayList<Requirement> requirements) {
    Objective.requirements = requirements;
}

public int getTillComplete() {
    return tillComplete;
}

public void setTillComplete(int tillComplete) {
    this.tillComplete = tillComplete;
}

public void setName(String name) {
    this.name = name;
}

public void setRequirement(Requirement requirement) {
    this.requirement = requirement;
}

public void setReward(ItemStackSerializable reward) {
    this.reward = reward;
}

public void setComplete(boolean complete) {
    this.complete = complete;
}

public ItemStack getReward() {
    return reward;
}

public boolean isComplete() {
    return complete;
}

}

在我的代码的其他地方这行代码:

ItemStack reward = new ItemStack(Material.DIAMOND_SWORD);
                        Objective objective = new Objective(args[1] ,Integer.parseInt(args[2]), Integer.parseInt(args[3]), reward);

给我这个错误:

java.io.NotSerializableException: org.bukkit.inventory.ItemStack

如何序列化这个对象?我需要存储它,但 Java 不会让我这样做。谢谢你的帮助。如果您需要更多代码 sn-ps 或其他信息,请告诉我。

【问题讨论】:

    标签: java serialization minecraft bukkit


    【解决方案1】:

    这很可能是 XY 问题。 ItemStack 不可序列化,因为它表示运行时的实际项目堆栈。存储在文件中是没有意义的。可能值得看一下ConfigurationSerializable 接口,它由ItemStack 实现,但我认为您在这里不需要。

    在您的示例中,您尝试序列化的 ItemStack 没有任何元数据。这是一把单钻剑。如果您所有的奖励都只是一个项目,那么您只需要保存Material,并且每次想要给玩家奖励时,您都可以从该Material 创建一个新的ItemStack。因为Materialenum,所以默认是可序列化的。

    如果您的某些奖励需要多个项目的堆叠,您还可以序列化 int 以获得堆叠大小。如果您需要任何元数据,请在运行时序列化构建该元数据所需的数据。例如,要提供物品知识,您将存储一个List&lt;String&gt;(带有List 的可序列化实现)。

    【讨论】:

    • 请注意,ItemStacks 也可能包含 NBT 数据,但幸运的是 NBT 数据也是可序列化的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多