Create custom deserializer for BlocksIgnoreRequest

This commit is contained in:
kuroppoi 2022-04-15 03:25:49 +02:00
parent 781096ee2c
commit 03b7264c04
2 changed files with 62 additions and 0 deletions

View file

@ -0,0 +1,57 @@
package brainwine.gameserver.serialization;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import brainwine.gameserver.server.requests.BlocksIgnoreRequest;
public class BlocksIgnoreRequestDeserializer extends StdDeserializer<BlocksIgnoreRequest> {
public static final BlocksIgnoreRequestDeserializer INSTANCE = new BlocksIgnoreRequestDeserializer();
private static final long serialVersionUID = -3423549008026709552L;
protected BlocksIgnoreRequestDeserializer() {
super(BlocksIgnoreRequest.class);
}
@Override
public BlocksIgnoreRequest deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
BlocksIgnoreRequest request = new BlocksIgnoreRequest();
if(parser.currentToken() != JsonToken.START_ARRAY) {
throw new IOException("Got invalid token, expected START_ARRAY");
}
if(parser.nextToken() == JsonToken.VALUE_NUMBER_INT) {
List<Integer> chunkIndices = new ArrayList<>();
while(parser.currentToken() != JsonToken.END_ARRAY) {
chunkIndices.add(parser.getIntValue());
parser.nextToken();
}
request.chunkIndices = toArray(chunkIndices);
} else {
request.chunkIndices = parser.readValueAs(int[].class);
}
return request;
}
private int[] toArray(List<Integer> list) {
int[] array = new int[list.size()];
for(int i = 0; i < array.length; i++) {
array[i] = list.get(i);
}
return array;
}
}

View file

@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier;
import brainwine.gameserver.server.Request;
import brainwine.gameserver.server.requests.BlocksIgnoreRequest;
public class RequestDeserializerModifier extends BeanDeserializerModifier {
@ -18,6 +19,10 @@ public class RequestDeserializerModifier extends BeanDeserializerModifier {
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
Class<?> clazz = beanDesc.getBeanClass();
if(BlocksIgnoreRequest.class.isAssignableFrom(clazz)) {
return BlocksIgnoreRequestDeserializer.INSTANCE;
}
if(Request.class.isAssignableFrom(clazz)) {
return new RequestDeserializer((Class<? extends Request>)clazz);
}