v1.3
This commit is contained in:
parent
993ab1e11f
commit
c578f25ac6
|
@ -16,8 +16,10 @@ public class AuLib extends JavaPlugin {
|
||||||
|
|
||||||
Lang.registerLangFile(this);
|
Lang.registerLangFile(this);
|
||||||
Lang.reload(this);
|
Lang.reload(this);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void registerListeners() {
|
private void registerListeners() {
|
||||||
new GuiHandlerListener(this);
|
new GuiHandlerListener(this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
package com.io.yutian.aulib.exception;
|
||||||
|
|
||||||
|
public class SerializeException extends RuntimeException {
|
||||||
|
|
||||||
|
public SerializeException(Class clazz, Throwable cause) {
|
||||||
|
super(clazz.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
package com.io.yutian.aulib.serialize;
|
||||||
|
|
||||||
|
import org.json.JSONObject;
|
||||||
|
|
||||||
|
public interface ISerializable<T> {
|
||||||
|
|
||||||
|
JSONObject serialize();
|
||||||
|
|
||||||
|
T deserialize(JSONObject jsonObject);
|
||||||
|
|
||||||
|
}
|
186
src/main/java/com/io/yutian/aulib/serialize/SerializeHelper.java
Normal file
186
src/main/java/com/io/yutian/aulib/serialize/SerializeHelper.java
Normal file
|
@ -0,0 +1,186 @@
|
||||||
|
package com.io.yutian.aulib.serialize;
|
||||||
|
|
||||||
|
import com.io.yutian.aulib.exception.SerializeException;
|
||||||
|
import com.io.yutian.aulib.util.ReflectionUtil;
|
||||||
|
import org.json.JSONArray;
|
||||||
|
import org.json.JSONObject;
|
||||||
|
import sun.misc.Unsafe;
|
||||||
|
|
||||||
|
import java.lang.reflect.Array;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.ParameterizedType;
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class SerializeHelper {
|
||||||
|
|
||||||
|
private static Map<Class<?>, Serializer> serializers = new HashMap<>();
|
||||||
|
|
||||||
|
public static <T, V> void registerSerializer(Class<T> clazz, Serializer<T, V> serializer) {
|
||||||
|
serializers.put(clazz, serializer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> JSONObject serialize(T obj) throws SerializeException {
|
||||||
|
try {
|
||||||
|
JSONObject jsonObject = new JSONObject();
|
||||||
|
Class clazz = obj.getClass();
|
||||||
|
for (Field field : clazz.getDeclaredFields()) {
|
||||||
|
field.setAccessible(true);
|
||||||
|
if (field.isAnnotationPresent(SerializeIgnore.class)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Object value = field.get(obj);
|
||||||
|
Object serializeValue = serializeValue(value);
|
||||||
|
jsonObject.put(field.getName(), serializeValue);
|
||||||
|
}
|
||||||
|
return jsonObject;
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new SerializeException(obj.getClass(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> T deserialize(Class<T> clazz, JSONObject jsonObject) throws SerializeException {
|
||||||
|
try {
|
||||||
|
Unsafe unsafe = ReflectionUtil.getUnsafe();
|
||||||
|
T instance = (T) unsafe.allocateInstance(clazz);
|
||||||
|
for (Field field : clazz.getDeclaredFields()) {
|
||||||
|
field.setAccessible(true);
|
||||||
|
if (field.isAnnotationPresent(SerializeIgnore.class)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String name = field.getName();
|
||||||
|
if (name.equalsIgnoreCase("this$0")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!jsonObject.has(name)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Object value = jsonObject.get(name);
|
||||||
|
if (value == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Object deserializeValue = deserializeValue(field, field.getType(), value);
|
||||||
|
field.set(instance, deserializeValue);
|
||||||
|
}
|
||||||
|
return instance;
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new SerializeException(clazz, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Object deserializeValue(Field field, Class clazz0, Object value) throws SerializeException {
|
||||||
|
Class clazz = clazz0;
|
||||||
|
if (WRAPPER_TO_PRIMITIVE.containsKey(clazz)) {
|
||||||
|
clazz = WRAPPER_TO_PRIMITIVE.get(clazz);
|
||||||
|
}
|
||||||
|
if (serializers.containsKey(clazz)) {
|
||||||
|
Serializer serializer = serializers.get(clazz);
|
||||||
|
return serializer.deserialize(value);
|
||||||
|
}
|
||||||
|
if (ISerializable.class.isAssignableFrom(clazz)) {
|
||||||
|
ISerializable iSerializable = (ISerializable) value;
|
||||||
|
JSONObject jsonObject = (JSONObject) value;
|
||||||
|
return iSerializable.deserialize(jsonObject);
|
||||||
|
} else if (clazz.isPrimitive() || clazz.equals(String.class)) {
|
||||||
|
return value;
|
||||||
|
} else if (clazz.isEnum()) {
|
||||||
|
return Enum.valueOf((Class<Enum>) clazz, (String) value);
|
||||||
|
} else if (clazz.isArray()) {
|
||||||
|
JSONArray jsonArray = (JSONArray) value;
|
||||||
|
int length = jsonArray.length();
|
||||||
|
Object object = Array.newInstance(clazz.getComponentType(), length);
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
Array.set(object, i, deserializeValue(field, clazz.getComponentType(), jsonArray.get(i)));
|
||||||
|
}
|
||||||
|
return object;
|
||||||
|
} else if (List.class.isAssignableFrom(clazz)) {
|
||||||
|
List list = new ArrayList();
|
||||||
|
JSONArray jsonArray = (JSONArray) value;
|
||||||
|
Type genericType = field.getGenericType();
|
||||||
|
Class<?> elementType = (Class<?>) ((ParameterizedType) genericType).getActualTypeArguments()[0];
|
||||||
|
for (int i = 0; i < jsonArray.length(); i++) {
|
||||||
|
list.add(deserializeValue(field, elementType, jsonArray.get(i)));
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
} else if (Map.class.isAssignableFrom(clazz)) {
|
||||||
|
Map map = new HashMap();
|
||||||
|
Type genericType = field.getGenericType();
|
||||||
|
Class<?> valueType = (Class<?>) ((ParameterizedType) genericType).getActualTypeArguments()[1];
|
||||||
|
JSONObject jsonObject = (JSONObject) value;
|
||||||
|
for (String key : jsonObject.keySet()) {
|
||||||
|
map.put(key, deserializeValue(field, valueType, jsonObject.get(key)));
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Object serializeValue(Object value) throws SerializeException {
|
||||||
|
Class clazz = value.getClass();
|
||||||
|
if (WRAPPER_TO_PRIMITIVE.containsKey(clazz)) {
|
||||||
|
clazz = WRAPPER_TO_PRIMITIVE.get(clazz);
|
||||||
|
}
|
||||||
|
if (serializers.containsKey(clazz)) {
|
||||||
|
Serializer serializer = serializers.get(clazz);
|
||||||
|
return serializer.serialize(value);
|
||||||
|
}
|
||||||
|
if (ISerializable.class.isAssignableFrom(clazz)) {
|
||||||
|
ISerializable iSerializable = (ISerializable) value;
|
||||||
|
return iSerializable.serialize();
|
||||||
|
} else if (clazz.isPrimitive() || clazz.equals(String.class)) {
|
||||||
|
return value;
|
||||||
|
} else if (clazz.isEnum()) {
|
||||||
|
return ((Enum) value).name();
|
||||||
|
} else if (clazz.isArray()) {
|
||||||
|
Class elementType = clazz.getComponentType();
|
||||||
|
JSONArray jsonArray = new JSONArray();
|
||||||
|
int length = Array.getLength(value);
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
Object element = Array.get(value, i);
|
||||||
|
jsonArray.put(serializeValue(element));
|
||||||
|
}
|
||||||
|
return jsonArray;
|
||||||
|
} else if (List.class.isAssignableFrom(clazz)) {
|
||||||
|
List list = (List) value;
|
||||||
|
JSONArray jsonArray = new JSONArray();
|
||||||
|
for (Object element : list) {
|
||||||
|
jsonArray.put(serializeValue(element));
|
||||||
|
}
|
||||||
|
return jsonArray;
|
||||||
|
} else if (Map.class.isAssignableFrom(clazz)) {
|
||||||
|
Map map = (Map) value;
|
||||||
|
JSONObject jsonObject = new JSONObject();
|
||||||
|
for (Object key : map.keySet()) {
|
||||||
|
jsonObject.put(key.toString(), serializeValue(map.get(key)));
|
||||||
|
}
|
||||||
|
return jsonObject;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final Map<Class<?>, Class<?>> WRAPPER_TO_PRIMITIVE = new HashMap<>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
WRAPPER_TO_PRIMITIVE.put(Boolean.class, boolean.class);
|
||||||
|
WRAPPER_TO_PRIMITIVE.put(Byte.class, byte.class);
|
||||||
|
WRAPPER_TO_PRIMITIVE.put(Short.class, short.class);
|
||||||
|
WRAPPER_TO_PRIMITIVE.put(Character.class, char.class);
|
||||||
|
WRAPPER_TO_PRIMITIVE.put(Integer.class, int.class);
|
||||||
|
WRAPPER_TO_PRIMITIVE.put(Long.class, long.class);
|
||||||
|
WRAPPER_TO_PRIMITIVE.put(Float.class, float.class);
|
||||||
|
WRAPPER_TO_PRIMITIVE.put(Double.class, double.class);
|
||||||
|
|
||||||
|
registerSerializer(UUID.class, new Serializer<>() {
|
||||||
|
@Override
|
||||||
|
public Object serialize(UUID value) {
|
||||||
|
return value.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UUID deserialize(Object value) {
|
||||||
|
return UUID.fromString((String) value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
package com.io.yutian.aulib.serialize;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Target(ElementType.FIELD)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface SerializeIgnore {
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package com.io.yutian.aulib.serialize;
|
||||||
|
|
||||||
|
public interface Serializer<K, V> {
|
||||||
|
|
||||||
|
V serialize(K value);
|
||||||
|
|
||||||
|
K deserialize(V value);
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user