@@ -0,0 +1,1996 @@
+package com.afterkraft.kraftrpg.api.util;%0A%0Aimport java.util.HashMap;%0Aimport java.util.Iterator;%0Aimport java.util.List;%0Aimport java.util.ListIterator;%0Aimport java.util.Map;%0A%0Aimport org.bukkit.configuration.serialization.ConfigurationSerializable;%0Aimport org.bukkit.configuration.serialization.ConfigurationSerialization;%0A%0Apublic class SerializationUtil %7B%0A%0A    public static Map%3CString, Object%3E fullySerialize(ConfigurationSerializable obj) %7B%0A        Map%3CString, Object%3E ret = new HashMap%3CString, Object%3E(obj.serialize());%0A%0A        for (Map.Entry%3CString, Object%3E entry : ret.entrySet()) %7B%0A            if (entry.getValue() instanceof ConfigurationSerializable) %7B%0A                entry.setValue(fullySerialize((ConfigurationSerializable) entry.getValue()));%0A            %7D%0A        %7D%0A%0A        ret.put(ConfigurationSerialization.SERIALIZED_TYPE_KEY, ConfigurationSerialization.getAlias(obj.getClass()));%0A%0A        return ret;%0A    %7D%0A%0A    public static Object fullyDeserializeInternal(Object o) %7B%0A        if (o instanceof Map) %7B%0A            Map%3C?, ?%3E inner = (Map%3C?, ?%3E) o;%0A            // Rudimentary type-check to make sure it's a map from String%0A            Iterator%3C?%3E temp = inner.keySet().iterator();%0A            if (temp.hasNext() && temp.next() instanceof String) %7B%0A                return fullyDeserialize((Map%3CString, Object%3E) o);%0A            %7D%0A        %7D else if (o instanceof List) %7B%0A            List%3CObject%3E inner = (List%3CObject%3E) o;%0A            ListIterator%3CObject%3E iter = inner.listIterator();%0A            while (iter.hasNext()) %7B%0A                Object item = iter.next();%0A                iter.set(fullyDeserializeInternal(item));%0A            %7D%0A        %7D%0A        return o;%0A    %7D%0A%0A    public static ConfigurationSerializable fullyDeserialize(Map%3CString, Object%3E data) %7B%0A        for (Map.Entry%3CString, Object%3E entry : data.entrySet()) %7B%0A            entry.setValue(fullyDeserializeInternal(entry.getValue()));%0A        %7D%0A%0A        return ConfigurationSerialization.deserializeObject(data);%0A    %7D%0A%7D%0A

Add SerializationUtil for persisted skill data