2017-06-08 10 views
0

ItemStackはシリアライズ可能ではなく、ObjectStackフィールドを持つObjectiveオブジェクトをファイルに保存しようとしています。私はItemStackを拡張してSerializableを実装し、新しい直列化可能なサブクラスにフィールドを変更しようとしましたが、これもうまくいきませんでした。Bukkit ItemStackフィールドをファイルに保存しようとしましたが、ItemStackはSerrializableではありません

java.io.NotSerializableException: org.bukkit.inventory.ItemStack 
:私は、このエラーを与えている

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

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は私をさせません。ご協力いただきありがとうございます。コードスニペットやその他の情報が必要な場合はお知らせください。

答えて

1

これはおそらくXYの問題です。 ItemStackは、実行時にアイテムの実際のスタックを表すため、シリアライズ可能ではありません。これは、ファイルに格納する意味がありません。 ConfigurationSerializableインターフェイスを調べる価値はあるかもしれませんが、これはItemStackによって実装されていますが、ここではそれが必要ではないと思います。

例では、シリアル化しようとしているItemStackにはメタデータがありません。それは単一のダイヤモンドの剣です。すべての報酬が単品である場合は、保存する必要があるのはMaterialで、プレーヤーに報酬を与えるたびにから新しいItemStackを作成することができます。 Materialenumなので、デフォルトではシリアライズ可能です。

報酬の一部に複数のアイテムのスタックが必要な場合は、intのスタックサイズをシリアル化することもできます。メタデータが必要な場合は、実行時にそのメタデータを構築するために必要なデータをシリアル化します。たとえば、アイテムを伝えるには、(シリアル化可能な実装はList)を格納します。

+0

ItemStacksにはNBTデータも含まれることがありますが、幸いにもNBTデータもシリアライズ可能です。 – Draco18s

関連する問題