仅在某些字段上使用自定义反序列化程序?

时间:2011-07-27 08:44:16

标签: gson

使用gson,是否可以仅在某些字段上使用自定义反序列化器/序列化器? user guide显示了如何为整个类型注册适配器,而不是为特定字段注册。我想要这个的原因是因为我解析了自定义日期格式并将其存储在long成员字段中(作为Unix时间戳),因此我不想为所有{{1}注册类型适配器} fields。

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:7)

我还在我的对象中将日期值存储为long,以便轻松防御副本。我还想要一种在序列化对象时只覆盖日期字段而不必写出进程中所有字段的方法。这是我提出的解决方案。不确定这是处理这个的最佳方式,但它似乎表现得很好。

DateUtil类是一个自定义类,用于将Date解析为String

public final class Person {
  private final String firstName;
  private final String lastName;
  private final long birthDate;

  private Person(String firstName, String lastName, Date birthDate) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.birthDate = birthDate.getTime();
  }

  public static Person getInstance(String firstName, String lastName, Date birthDate) {
    return new Person(firstName, lastName, birthDate);
  }

  public String toJson() {
    return new GsonBuilder().registerTypeAdapter(Person.class, new PersonSerializer()).create().toJson(this);
  }

  public static class PersonSerializer implements JsonSerializer<Person> {
    @Override
    public JsonElement serialize(Person person, Type type, JsonSerializationContext context) {
      JsonElement personJson = new Gson().toJsonTree(person);
      personJson.getAsJsonObject().add("birthDate", new JsonPrimitive(DateUtil.getFormattedDate(new Date(policy.birthDate), DateFormat.USA_DATE)));
      return personJson;
    }
  }
}

当序列化类时,birthDate字段将以格式化String而不是long值的形式返回。

答案 1 :(得分:1)

不要将其存储为long,请使用带有适当适配器的自定义类型。在您的类型中,以您想要的任何方式表示您的数据 - long,为什么不。