Lua serializer & deserializer optimization

This commit is contained in:
Michael Wain 2024-04-03 16:29:47 +03:00
parent a136183d18
commit b1bf37bb7e
3 changed files with 52 additions and 30 deletions

View File

@ -16,8 +16,8 @@
<packaging>jar</packaging>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>14</maven.compiler.source>
<maven.compiler.target>14</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

View File

@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j;
import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@ -20,6 +21,39 @@ public class LuaDeserializer {
.collect(Collectors.toList());
}
private static <T> T deserialize(LuaTable table, Class<T> obj) {
try {
List<String> keys = Arrays.stream(table.keys())
.map(LuaValue::checkjstring)
.collect(Collectors.toList());
T result = obj.getDeclaredConstructor().newInstance();
Arrays.stream(obj.getDeclaredFields())
.filter(f -> keys.contains(f.getName()))
.forEach(f -> {
try {
f.setAccessible(true);
f.set(result, checkObject(f, table.get(f.getName())));
} catch (IllegalAccessException e) {
log.error(e.getMessage());
}
});
return result;
} catch (Exception e) {
log.error(e.getMessage());
}
return null;
}
private static Object checkObject(Field f, LuaValue val) {
return switch(f.getType().getCanonicalName()) {
case "java.lang.Boolean" -> val.checkboolean();
case "java.lang.Long" -> val.checklong();
case "java.lang.Float", "java.lang.Double" -> val.checkdouble();
case "java.lang.Integer" -> val.checkint();
default -> null;
};
}
private static Player deserializePlayer(LuaTable table) {
int age = table.get("age").checkint();
Player p = new Player(table.get("telegramId").checklong(), table.get("firstName").checkjstring());
@ -28,16 +62,24 @@ public class LuaDeserializer {
p.setIsVoted(table.get("isVoted").checkboolean());
p.setScriptMessageId(table.get("scriptMessageId").checkint());
p.setGender(deserializeGender(table.get("gender").checktable()));
p.setGender(deserialize(table.get("gender").checktable(), Bio.class));
p.setHealth(deserialize(table.get("health").checktable(), Health.class));
p.setHobby(deserialize(table.get("hobby").checktable(), Hobby.class));
p.setWork(deserialize(table.get("work").checktable(), Work.class));
p.setLuggage(deserialize(table.get("luggage").checktable(), Luggage.class));
p.setInfoSections(deserialize(table.get("infoSections").checktable(), InfoSections.class));
/*p.setGender(deserializeGender(table.get("gender").checktable()));
p.setHealth(deserializeHealth(table.get("health").checktable()));
p.setHobby(deserializeHobby(table.get("hobby").checktable()));
p.setWork(deserializeWork(table.get("work").checktable()));
p.setLuggage(deserializeLuggage(table.get("luggage").checktable()));
p.setInfoSections(deserializeInfoSections(table.get("infoSections").checktable()));
p.setInfoSections(deserializeInfoSections(table.get("infoSections").checktable()));*/
return p;
}
/*
private static InfoSections deserializeInfoSections(LuaTable table) {
InfoSections infoSections = new InfoSections();
infoSections.setIsGenderShowed(table.get("isGenderShowed").checkboolean());
@ -103,5 +145,5 @@ public class LuaDeserializer {
bio.setIsMale(table.get("isMale").checkboolean());
bio.setIsFemale(table.get("isFemale").checkboolean());
return bio;
}
} */
}

View File

@ -1,6 +1,5 @@
package com.alterdekim.javabot.util;
import com.alterdekim.javabot.bot.Player;
import lombok.extern.slf4j.Slf4j;
import org.luaj.vm2.LuaTable;
import org.luaj.vm2.LuaValue;
@ -17,12 +16,6 @@ import java.util.stream.IntStream;
@Slf4j
public class LuaSerializer {
/* public static LuaTable serializeObjectList(List<Player> list) {
LuaTable table = new LuaTable();
IntStream.range(0, list.size()).forEach(i -> table.set(i, serializeObject(list.get(i))));
return table;
}*/
public static LuaTable serializeObjectList(List<?> list) {
LuaTable table = new LuaTable();
IntStream.range(0, list.size()).forEach(i -> table.set(i, serializeObject(list.get(i))));
@ -31,15 +24,17 @@ public class LuaSerializer {
public static LuaValue serializeObject(Object o) {
Map<String, Object> map = new HashMap<>();
getPrivateFields(o.getClass()).stream()
getPrivateFields(o.getClass())
.forEach(f -> {
try {
f.setAccessible(true);
String type_name = ((Class) f.getType()).getName();
String name = f.getName();
switch (type_name) {
case "java.lang.Long":
map.put(name, ((Long) f.get(o)).longValue());
case "java.lang.Long", "java.lang.Integer",
"java.lang.Float", "java.lang.Double",
"java.lang.Boolean", "java.lang.String":
map.put(name, f.get(o));
break;
case "long":
map.put(name, f.getLong(o));
@ -47,30 +42,15 @@ public class LuaSerializer {
case "int":
map.put(name, f.getInt(o));
break;
case "java.lang.Integer":
map.put(name, ((Integer) f.get(o)).intValue());
break;
case "float":
map.put(name, f.getFloat(o));
break;
case "java.lang.Float":
map.put(name, ((Float) f.get(o)).floatValue());
break;
case "double":
map.put(name, f.getDouble(o));
break;
case "java.lang.Double":
map.put(name, ((Double) f.get(o)).doubleValue());
break;
case "boolean":
map.put(name, f.getBoolean(o));
break;
case "java.lang.Boolean":
map.put(name, ((Boolean) f.get(o)).booleanValue());
break;
case "java.lang.String":
map.put(name, (String) f.get(o));
break;
case "java.util.List":
break;
default: