Сериализация и десериализация поля в соответствии с другим значением поля - PullRequest
0 голосов
/ 18 ноября 2018

Как можно сериализовать или десериализовать поле в соответствии с другим значением поля в том же классе?

В следующем примере при сериализации или десериализации класса 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.

1 Ответ

0 голосов
/ 18 ноября 2018

Аналогично @ comment обновляет средство получения полезной нагрузки, чтобы возвращать различные выходные значения

 public String getPayload() {
     return "(" + getType().name().toLowerCase() + ") " +  this.payload;
 }
...