Как можно сериализовать или десериализовать поле в соответствии с другим значением поля в том же классе?
В следующем примере при сериализации или десериализации класса Packet
мне бы хотелось, чтобы поле type
определило , как поле payload
будет сериализовано и десериализовано.
PayloadType enum
public enum PayloadType {
HTTP,
HTTPS,
FTP
}
Пакетный класс
public class Packet {
private final String payload;
// This field should determine how "payload" field is serialized.
private final PayloadType type;
private final Date creationTime;
@JsonCreator
public Packet(String payload, PayloadType type) {
this.payload = payload;
this.type = type;
this.creationTime = new Date();
}
public String getPayload() {
return this.payload;
}
public PayloadType getType() {
return this.type;
}
public Date getCreationTime() {
return this.creationTime;
}
Тест
public class PacketTests {
@Test
public void packetSerialization_fromHttpType() throws JsonProcessingException {
// Given
ObjectMapper jackson = new ObjectMapper();
String payload = "hello world";
PayloadType type = PayloadType.HTTP;
Packet packet = new Packet(payload, type);
String json;
// When
json = jackson.writeValueAsString(packet);
// Then
System.out.println(json);
}
токовый выход
{"payload":"hello world","type":"HTTP","creationTime":1542538836041}
Ожидаемые результаты
{"payload":"(http) hello world","type":"HTTP","creationTime":1542538836041}
{"payload":"(https) hello world","type":"HTTPS","creationTime":1542538836041}
{"payload":"X9hnahj83","type":"FTP","creationTime":1542538836041}
payload
из FTP
является строкой base64.