feat: implemented proper Request serialization

This commit is contained in:
2021-05-30 18:07:28 +02:00
parent 6a6669ae5d
commit e6dc10e3f5
3 changed files with 308 additions and 0 deletions

View File

@ -0,0 +1,83 @@
package uulm.teamname.marvelous.gamelibrary.json.ingame;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import uulm.teamname.marvelous.gamelibrary.entities.EntityID;
import uulm.teamname.marvelous.gamelibrary.entities.EntityType;
import uulm.teamname.marvelous.gamelibrary.requests.CharacterRequest;
import uulm.teamname.marvelous.gamelibrary.requests.GameRequest;
import uulm.teamname.marvelous.gamelibrary.requests.Request;
import uulm.teamname.marvelous.gamelibrary.requests.RequestType;
import java.io.IOException;
public class RequestSerializer extends StdSerializer<Request> {
public RequestSerializer() {
this(null);
}
protected RequestSerializer(Class<Request> t) {
super(t);
}
@Override
public void serialize(Request value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeStartObject();
gen.writeObjectField("requestType", value.type);
if (value instanceof GameRequest) {
serializeGameRequest((GameRequest) value, gen, provider);
} else if (value instanceof CharacterRequest) {
serializeCharacterRequest((CharacterRequest) value, gen, provider);
}
gen.writeEndObject();
}
/** Method invoked after writing the RequestType, and used to write any additional values required */
private void serializeGameRequest(GameRequest value, JsonGenerator gen, SerializerProvider provider)
throws IOException {
return; // does nothing, but still there for consistency
}
/** Method invoked after writing the RequestType, and used to write any additional values required */
private void serializeCharacterRequest(CharacterRequest value, JsonGenerator gen, SerializerProvider provider)
throws IOException {
// The idea here is: if ([GUARD]) {gen.write...} for all fields.
boolean hasTargetEntity =
value.type == RequestType.MeleeAttackRequest ||
value.type == RequestType.RangedAttackRequest ||
value.type == RequestType.ExchangeInfinityStoneRequest;
boolean hasStoneType =
value.type == RequestType.ExchangeInfinityStoneRequest ||
value.type == RequestType.UseInfinityStoneRequest;
boolean hasValue =
value.type == RequestType.MeleeAttackRequest ||
value.type == RequestType.RangedAttackRequest;
gen.writeObjectField("originEntity", value.originEntity);
if (hasTargetEntity) {
gen.writeObjectField("targetEntity", value.targetEntity);
}
gen.writeObjectField("originField", value.originField);
gen.writeObjectField("targetField", value.targetField);
if (hasStoneType) {
gen.writeObjectField("stoneType", new EntityID(EntityType.InfinityStones, value.stoneType.getID()));
}
if (hasValue) {
gen.writeObjectField("value", value.value);
}
}
}

View File

@ -7,11 +7,13 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import uulm.teamname.marvelous.gamelibrary.json.basic.EventMessage;
import uulm.teamname.marvelous.gamelibrary.json.ingame.RequestDeserializer;
import uulm.teamname.marvelous.gamelibrary.json.ingame.RequestSerializer;
import java.util.Objects;
/** Represents an abstract request sent inside a {@link EventMessage} between client and server. */
@JsonDeserialize(using = RequestDeserializer.class)
@JsonSerialize(using = RequestSerializer.class)
public abstract class Request {
@JsonProperty("requestType") public RequestType type;