Solved Config can't deserialize my class when reloading plugin, "Specified Class Does not Exist"

Discussion in 'Plugin Development' started by TheBoy3, Aug 10, 2013.

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

    TheBoy3

    Hi, I recently have been working with Configurations and ConfigurationSerialization, so I can store my class, and everything works the way it's supposed to except that when I reload the plugin, I get this error:

    Code:
    11:22:18 [SEVERE] Cannot load plugins/MultiPlex/config.yml
    org.bukkit.configuration.InvalidConfigurationException: org.yaml.snakeyaml.error.YAMLException: Could not deserialize object
        at org.bukkit.configuration.file.YamlConfiguration.loadFromString(YamlConfiguration.java:55)
        at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:138)
        at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:105)
        at org.bukkit.configuration.file.YamlConfiguration.loadConfiguration(YamlConfiguration.java:175)
        at org.bukkit.plugin.java.JavaPlugin.reloadConfig(JavaPlugin.java:117)
        at org.bukkit.plugin.java.JavaPlugin.getConfig(JavaPlugin.java:111)
        at plugin.TheBoy3.MultiPlex.MultiPlex.createConfig(MultiPlex.java:84)
        at plugin.TheBoy3.MultiPlex.MultiPlex.onEnable(MultiPlex.java:51)
        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:217)
        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:457)
        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:382)
        at net.skycraftmc.PluginManager.PluginManagerPlugin.onCommand(PluginManagerPlugin.java:208)
        at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:192)
        at org.bukkit.craftbukkit.v1_6_R2.CraftServer.dispatchCommand(CraftServer.java:527)
        at org.bukkit.craftbukkit.v1_6_R2.CraftServer.dispatchServerCommand(CraftServer.java:516)
        at net.minecraft.server.v1_6_R2.DedicatedServer.ar(DedicatedServer.java:275)
        at net.minecraft.server.v1_6_R2.DedicatedServer.t(DedicatedServer.java:240)
        at net.minecraft.server.v1_6_R2.MinecraftServer.s(MinecraftServer.java:481)
        at net.minecraft.server.v1_6_R2.MinecraftServer.run(MinecraftServer.java:413)
        at net.minecraft.server.v1_6_R2.ThreadServerApplication.run(SourceFile:582)
    Caused by: org.yaml.snakeyaml.error.YAMLException: Could not deserialize object
        at org.bukkit.configuration.file.YamlConstructor$ConstructCustomObject.construct(YamlConstructor.java:37)
        at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:182)
        at org.yaml.snakeyaml.constructor.BaseConstructor.constructMapping2ndStep(BaseConstructor.java:325)
        at org.yaml.snakeyaml.constructor.SafeConstructor.constructMapping2ndStep(SafeConstructor.java:145)
        at org.yaml.snakeyaml.constructor.BaseConstructor.constructMapping(BaseConstructor.java:306)
        at org.yaml.snakeyaml.constructor.SafeConstructor$ConstructYamlMap.construct(SafeConstructor.java:461)
        at org.bukkit.configuration.file.YamlConstructor$ConstructCustomObject.construct(YamlConstructor.java:26)
        at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:182)
        at org.yaml.snakeyaml.constructor.BaseConstructor.constructMapping2ndStep(BaseConstructor.java:325)
        at org.yaml.snakeyaml.constructor.SafeConstructor.constructMapping2ndStep(SafeConstructor.java:145)
        at org.yaml.snakeyaml.constructor.BaseConstructor.constructMapping(BaseConstructor.java:306)
        at org.yaml.snakeyaml.constructor.SafeConstructor$ConstructYamlMap.construct(SafeConstructor.java:461)
        at org.bukkit.configuration.file.YamlConstructor$ConstructCustomObject.construct(YamlConstructor.java:26)
        at org.yaml.snakeyaml.constructor.BaseConstructor.constructObject(BaseConstructor.java:182)
        at org.yaml.snakeyaml.constructor.BaseConstructor.constructDocument(BaseConstructor.java:141)
        at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:127)
        at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:481)
        at org.yaml.snakeyaml.Yaml.load(Yaml.java:400)
        at org.bukkit.configuration.file.YamlConfiguration.loadFromString(YamlConfiguration.java:53)
        ... 20 more
    Caused by: java.lang.IllegalArgumentException: Specified class does not exist ('plugin.TheBoy3.MultiPlex.Types.IntegerBasedPlot')
        at org.bukkit.configuration.serialization.ConfigurationSerialization.deserializeObject(ConfigurationSerialization.java:177)
        at org.bukkit.configuration.file.YamlConstructor$ConstructCustomObject.construct(YamlConstructor.java:35)
        ... 38 more
    
    I have know that IntegerBasedPlot does exist, and is in the right package (plugin.TheBoy3,MultiPlex.Types.IntegerBasedPlot) and I even used JD-GUI to check the jar to make sure that the package exported properly, but it's still giving me this error. Because of this, I am forced to delete my stored class info from the config every time I reload the plugin.

    Here is some other code that may not be helpful, but a bit of extra information can't hurt:

    serialize and deserialize methods in IntegerBasedPlot.java:

    Code:java
    1. public Map<String, Object> serialize() {
    2. Map<String, Object> result = new HashMap<String, Object>();
    3.  
    4. result.put("minimumlocation", getMinimumIntegerLocation());
    5.  
    6. result.put("maximumlocation", getMaximumIntegerLocation());
    7.  
    8. result.put("locationarrays", getIntegerLocationArrays());
    9.  
    10. result.put("worldUID", getWorldUID());
    11.  
    12. result.put("price", getPrice());
    13.  
    14. result.put("ownerUUID", getOwnerUUID());
    15.  
    16. return result;
    17. }
    18.  
    19. public static IntegerBasedPlot deserialize(Map<String, Object> args) throws Exception {
    20. String worldUID = null;
    21. World world;
    22. Double price = 0.0;
    23.  
    24. if (args.containsKey("price")) {
    25. price = (Double) args.get("price");
    26. }
    27.  
    28. if (args.containsKey("worldUID")) {
    29. worldUID = (String) args.get("worldUID");
    30. }
    31.  
    32. world = getWorldInStaticContext(worldUID);
    33.  
    34. Location min = new Location(world, 0, 0, 0);
    35. Location max = new Location(world, 1, 1, 1);
    36.  
    37. if (args.containsKey("minimumlocation")) {
    38. min = (Location) args.get("minimumlocation");
    39. }
    40. if (args.containsKey("maximumlocation")) {
    41. max = (Location) args.get("maximumlocation");
    42. }
    43.  
    44. return new IntegerBasedPlot(world, min, max, price);
    45. }


    Configuration Serialization class registration in onEnable():

    Code:java
    1. public void onEnable() {
    2. PluginDescriptionFile pdfFile = this.getDescription();
    3.  
    4. vaultlink = new VaultLink(this);
    5. metricslink = new MetricsLink(this);
    6.  
    7. vaultlink.setupVault(Bukkit.getPluginManager());
    8.  
    9. createConfig();
    10. callListeners();
    11. setCommandExecutors();
    12.  
    13. ConfigurationSerialization.registerClass(IntegerBasedPlot.class);
    14.  
    15. metricslink.InitializeMetrics();
    16.  
    17. logger.info(pdfFile.getName() + " " + pdfFile.getVersion() + " has been Enabled.");
    18. }


    Can anyone help me with this? It is very annoying to have to delete the plot and start over again.

    Bumped

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jun 3, 2016
  2. Offline

    raGan.

    Register your class in the constructor of your plugin class, instead of onEnable().
     
  3. Offline

    TheBoy3

    raGan.

    Oh thanks, it works now! :)
     
Thread Status:
Not open for further replies.

Share This Page