Solved serializing a custom object like a ItemStack?

Discussion in 'Plugin Development' started by xize, Jun 3, 2014.

Thread Status:
Not open for further replies.
  1. Offline

    xize

    Hello,

    so I'm playing around with some code I made just to learn or understand how bukkit serializes their ItemStacks in yaml but now with a custom object.

    however for now I can't pinpoint my error/problem since the stacktrace actually makes me kinda confused cause it says to me that the type Location cannot be serialized because there is no constructor like its not a java bean while that is kinda strange though..

    my stacktrace:
    Code:
    [22:11:42] [Server thread/ERROR]: Cannot load plugins\xEssentials\regen\regen.dat
    org.bukkit.configuration.InvalidConfigurationException: could not determine a constructor for the tag tag:yaml.org,2002:org.bukkit.Location
     in "<string>", line 5, column 7:
            - !!org.bukkit.Location
              ^
     at org.bukkit.configuration.file.YamlConfiguration.loadFromString(YamlConfiguration.java:57) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:226) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:169) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.bukkit.configuration.file.YamlConfiguration.loadConfiguration(YamlConfiguration.java:180) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at tv.mineinthebox.essentials.utils.RegenList.loadRegenObjects(RegenList.java:42) [xEssentials-3.3.jar:?]
     at tv.mineinthebox.essentials.xEssentials.onEnable(xEssentials.java:92) [xEssentials-3.3.jar:?]
     at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:316) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:324) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:404) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.bukkit.craftbukkit.v1_7_R3.CraftServer.loadPlugin(CraftServer.java:446) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.bukkit.craftbukkit.v1_7_R3.CraftServer.enablePlugins(CraftServer.java:380) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.bukkit.craftbukkit.v1_7_R3.CraftServer.reload(CraftServer.java:799) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.bukkit.Bukkit.reload(Bukkit.java:288) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:23) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:180) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.bukkit.craftbukkit.v1_7_R3.CraftServer.dispatchCommand(CraftServer.java:701) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at net.minecraft.server.v1_7_R3.PlayerConnection.handleCommand(PlayerConnection.java:956) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at net.minecraft.server.v1_7_R3.PlayerConnection.a(PlayerConnection.java:817) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at net.minecraft.server.v1_7_R3.PacketPlayInChat.a(PacketPlayInChat.java:28) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at net.minecraft.server.v1_7_R3.PacketPlayInChat.handle(PacketPlayInChat.java:47) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at net.minecraft.server.v1_7_R3.NetworkManager.a(NetworkManager.java:157) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at net.minecraft.server.v1_7_R3.ServerConnection.c(SourceFile:134) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at net.minecraft.server.v1_7_R3.MinecraftServer.v(MinecraftServer.java:667) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at net.minecraft.server.v1_7_R3.DedicatedServer.v(DedicatedServer.java:260) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at net.minecraft.server.v1_7_R3.MinecraftServer.u(MinecraftServer.java:558) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at net.minecraft.server.v1_7_R3.MinecraftServer.run(MinecraftServer.java:469) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at net.minecraft.server.v1_7_R3.ThreadServerApplication.run(SourceFile:628) [craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
    Caused by: org.yaml.snakeyaml.constructor.ConstructorException: null; could not determine a constructor for the tag tag:yaml.org,2002:org.bukkit.Location
     at org.yaml.snakeyaml.constructor.SafeConstructor$ConstructUndefined.construct(SafeConstructor.java:475) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:183) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.BaseConstructor.constructSequenceStep2(BaseConstructor.java:277) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.BaseConstructor.constructSequence(BaseConstructor.java:248) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.SafeConstructor$ConstructYamlSeq.construct(SafeConstructor.java:440) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:183) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.BaseConstructor.constructMapping2ndStep(BaseConstructor.java:326) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.SafeConstructor.constructMapping2ndStep(SafeConstructor.java:143) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.BaseConstructor.constructMapping(BaseConstructor.java:307) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.SafeConstructor$ConstructYamlMap.construct(SafeConstructor.java:459) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.bukkit.configuration.file.YamlConstructor$ConstructCustomObject.construct(YamlConstructor.java:26) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:183) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.BaseConstructor.constructSequenceStep2(BaseConstructor.java:277) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.BaseConstructor.constructSequence(BaseConstructor.java:248) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.SafeConstructor$ConstructYamlSeq.construct(SafeConstructor.java:440) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:183) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.BaseConstructor.constructMapping2ndStep(BaseConstructor.java:326) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.SafeConstructor.constructMapping2ndStep(SafeConstructor.java:143) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.BaseConstructor.constructMapping(BaseConstructor.java:307) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.SafeConstructor$ConstructYamlMap.construct(SafeConstructor.java:459) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.bukkit.configuration.file.YamlConstructor$ConstructCustomObject.construct(YamlConstructor.java:26) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:183) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.BaseConstructor.constructMapping2ndStep(BaseConstructor.java:326) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.SafeConstructor.constructMapping2ndStep(SafeConstructor.java:143) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.BaseConstructor.constructMapping(BaseConstructor.java:307) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.SafeConstructor$ConstructYamlMap.construct(SafeConstructor.java:459) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.bukkit.configuration.file.YamlConstructor$ConstructCustomObject.construct(YamlConstructor.java:26) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:183) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.BaseConstructor.constructDocument(BaseConstructor.java:142) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:128) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:480) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.yaml.snakeyaml.Yaml.load(Yaml.java:399) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     at org.bukkit.configuration.file.YamlConfiguration.loadFromString(YamlConfiguration.java:55) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.1-b3084jnks]
     ... 26 more
    [22:11:42] [Server thread/ERROR]: Error occurred while enabling xEssentials v3.3 (Is it up to date?)
    
    and my code of my RegenObject is:

    Code:java
    1.  
    2. public class RegenObject implements Runnable, ConfigurationSerializable {
    3. HashMap<Location, MaterialData> blocks;
    4. List<Location> locs;
    5.  
    6. private BukkitTask task;
    7. public RegenObject() {
    8. super();
    9. }
    10.  
    11. public void setValue(HashMap<Location, MaterialData> blocks, List<Location> locs) {
    12. this.blocks = blocks;
    13. this.locs = locs;
    14. startRegen();
    15. }
    16.  
    17. public RegenObject getValue() {
    18. return this;
    19. }
    20. /**
    21.   * @author xize
    22.   * @param starts the block regen task.
    23.   */
    24. public void startRegen() {
    25. if(!(task instanceof BukkitTask)) {
    26. this.task = Bukkit.getScheduler().runTaskTimer(xEssentials.getPlugin(), this, 0L, 1L);
    27. }
    28. }
    29.  
    30. /**
    31.   * @author xize
    32.   * @param stops the regen task.
    33.   */
    34. public void stopRegen() {
    35. if(task instanceof BukkitTask) {
    36. this.task.cancel();
    37. this.task = null;
    38. }
    39. if(xEssentials.getRegenList().getList.contains(this)) {
    40. xEssentials.getRegenList().getList.remove(this);
    41. }
    42.  
    43. }
    44. @SuppressWarnings("deprecation")
    45. @Override
    46. public void run() {
    47. System.out.print("scheduler is still running.");
    48. Iterator<Location> it = locs.iterator();
    49. if(it.hasNext()) {
    50.  
    51.  
    52. ItemStack item = new ItemStack(Material.SKULL_ITEM, 1, (short)3);
    53. SkullMeta meta = (SkullMeta) item.getItemMeta();
    54. meta.setOwner("something");
    55. item.setItemMeta(meta);
    56.  
    57. Location loc = it.next();
    58. MaterialData data = blocks.get(loc);
    59. System.out.print("setting block!");
    60. loc.getBlock().setTypeIdAndData(data.getItemTypeId(), data.getData(), true);
    61. loc.getWorld().playEffect(loc, Effect.STEP_SOUND, data.getItemTypeId());
    62. it.remove();
    63. blocks.remove(loc);
    64. locs.remove(loc);
    65. } else {
    66. System.out.print("its stopped regen");
    67. stopRegen();
    68. }
    69. }
    70. @Override
    71. public String toString() {
    72. return "RegenObject [blocks=" + blocks + ", task=" + task
    73. + ", getClass()=" + getClass() + ", hashCode()=" + hashCode()
    74. + ", toString()=" + super.toString() + "]";
    75. }
    76. @Override
    77. public int hashCode() {
    78. final int prime = 31;
    79. int result = 1;
    80. result = prime * result + ((blocks == null) ? 0 : blocks.hashCode());
    81. result = prime * result + ((task == null) ? 0 : task.hashCode());
    82. return result;
    83. }
    84. @Override
    85. public boolean equals(Object obj) {
    86. if (this == obj)
    87. return true;
    88. if (obj == null)
    89. return false;
    90. if (getClass() != obj.getClass())
    91. return false;
    92. RegenObject other = (RegenObject) obj;
    93. if (blocks == null) {
    94. if (other.blocks != null)
    95. return false;
    96. } else if (!blocks.equals(other.blocks))
    97. return false;
    98. if (task == null) {
    99. if (other.task != null)
    100. return false;
    101. } else if (!task.equals(other.task))
    102. return false;
    103. return true;
    104. }
    105. @Utility
    106. public Map<String, Object> serialize() {
    107. Map<String, Object> result = new LinkedHashMap<String, Object>();
    108. result.put("blocks-keys", blocks.keySet().toArray(new Location[blocks.size()]));
    109. result.put("blocks-values", blocks.values().toArray(new MaterialData[blocks.size()]));
    110. result.put("locations", locs.toArray(new Location[locs.size()]));
    111.  
    112. return result;
    113. }
    114.  
    115. public RegenObject deserialize(Map<String, Object> map) {
    116. List<Location> keys = Arrays.asList((Location[])map.get("blocks-keys"));
    117. List<MaterialData> values = Arrays.asList((MaterialData[])map.get("blocks-values"));
    118.  
    119. HashMap<Location, MaterialData> data = new HashMap<Location, MaterialData>();
    120.  
    121. for(int i = 0; i < keys.size(); i++) {
    122. data.put(keys.get(i), values.get(i));
    123. }
    124.  
    125. List<Location> locdata = new ArrayList<Location>();
    126.  
    127. Collections.addAll(keys, (Location[])map.get("locations"));
    128.  
    129. RegenObject regen = new RegenObject();
    130. regen.setValue(data, locdata);
    131. return regen;
    132. }
    133. }
    134.  


    note that I won't want to deserialize the object per field such like x:y:z, I actually want the same behaviour as ItemStacks so I can actually do this call but then for my custom object:
    Code:
    ItemStack[] contents = ((List<ItemStack>)con.get("orginalinv.items")).toArray(new ItemStack[0]);
    
    I hope this is actually not to impossible todo I hope, thanks for the help though:)
     
  2. Offline

    FabeGabeMC

  3. Offline

    flaaghara

    You can just use a long string to store information. I remember a library a while ago that was cleverly coded using reflection and recursion which could pretty much serialize any object. I'll see if I can find the name/
     
  4. Offline

    xize

    flaaghara FabeGabeMC

    thanks for the help, however this is not exactly what I'm searching however I geuss its nearly impossible or atleast for me to make this work so instead I decided to still stick with the manual serializing like x:y:z the problem was that I had to save it some how per scheduler so with that means that my explosion regen still runs through multiple schedulers but I can save it like regen_taskid.yml which solves my problem.
     
Thread Status:
Not open for further replies.

Share This Page