Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 试图将Bukkit ItemStack字段存储到文件,但ItemStack不可序列化_Java_Serialization_Minecraft_Bukkit - Fatal编程技术网

Java 试图将Bukkit ItemStack字段存储到文件,但ItemStack不可序列化

Java 试图将Bukkit ItemStack字段存储到文件,但ItemStack不可序列化,java,serialization,minecraft,bukkit,Java,Serialization,Minecraft,Bukkit,ItemStack不可序列化,我正在尝试将名为Objective的对象和ItemStack字段保存到文件中,但由于ItemStack不可序列化,因此这不起作用。我尝试扩展ItemStack并实现Serializable,并将字段更改为新的Serializable子类,但这也不起作用。以下是我的原始代码的相关部分: import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import or

ItemStack不可序列化,我正在尝试将名为Objective的对象和ItemStack字段保存到文件中,但由于ItemStack不可序列化,因此这不起作用。我尝试扩展ItemStack并实现Serializable,并将字段更改为新的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;
}
给我这个错误:

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

如何序列化此对象?我需要存储它,但Java不允许。谢谢你的帮助。如果您还需要代码片段或其他信息,请告诉我。

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

在您的示例中,您尝试序列化的
ItemStack
没有任何元数据。这是一把钻石剑。如果你所有的奖励都只是一个物品,你只需要保存
材料
,每次你想给玩家奖励时,你都可以从该
材料
中创建一个新的
物品堆栈。由于
材质
是一个
枚举
,因此默认情况下它是可序列化的


如果您的某些奖励需要多个项目的堆栈,您还可以序列化堆栈大小的
int
。如果您需要任何元数据,请在运行时序列化构建该元数据所需的数据。例如,要提供一个项目知识,您需要存储一个
列表(使用
列表的可序列化实现)

请注意,项目堆栈也可能包含NBT数据,但幸运的是NBT数据也是可序列化的。
java.io.NotSerializableException: org.bukkit.inventory.ItemStack