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不会让我。谢谢你的帮助。如果您需要更多代码段或其他信息,请告诉我们。
答案 0 :(得分:1)
这很可能是一个XY问题。 [b c c]
不可序列化,因为它表示运行时的实际项目堆栈。存储在文件中没有意义。可能值得查看由ItemStack
实现的ConfigurationSerializable
界面,但我认为您不需要这样做。
在您的示例中,您尝试序列化的ItemStack
没有任何元数据。这是一把单钻石剑。如果您的所有奖励只是一个项目,那么您需要保存的只是ItemStack
,并且每次您希望为玩家提供奖励时,您都可以从Material
创建新的ItemStack
。由于Material
是Material
,因此默认情况下可以序列化。
如果您的某些奖励需要多个项目的堆叠,您还可以序列化enum
的堆栈大小。如果需要任何元数据,请序列化在运行时构造该数据所需的数据。例如,要提供项目知识,您将存储int
(具有List<String>
的可序列化实现。)