当前位置: 首页 > 面试题库 >

如何序列化可选 和Gson一起上课?

谯阳伯
2023-03-14
问题内容

我有一个具有以下属性的对象。

private final String messageBundle;
private final List<String> messageParams;
private final String actionBundle;
private final Map<String, String> data;
private final Optional<Pair<Integer,TimeUnit>> ttl;
private final Optional<Integer> badgeNumber;
private final Optional<String> collapseKey;

该对象位于库中,我宁愿不要仅出于序列化目的对其进行修改,并且希望避免创建另一个DTO的开销。

如何序列化/反序列化Optional属性?Optional没有默认的构造函数(两者都不是apache commons
Pair),但是我不能使用InstanceCreator,也不真正理解如何创建TypeAdapter来将序列化委托给底层的Optional内容。


问题答案:

Ilya的解决方案忽略类型参数,因此在一般情况下它实际上无法工作。我的解决方案相当复杂,因为需要区分nullOptional.absent()-否则您可以将封装剥离为列表。

public class GsonOptionalDeserializer<T>
implements JsonSerializer<Optional<T>>, JsonDeserializer<Optional<T>> {

    @Override
    public Optional<T> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
        final JsonArray asJsonArray = json.getAsJsonArray();
        final JsonElement jsonElement = asJsonArray.get(0);
        final T value = context.deserialize(jsonElement, ((ParameterizedType) typeOfT).getActualTypeArguments()[0]);
        return Optional.fromNullable(value);
    }

    @Override
    public JsonElement serialize(Optional<T> src, Type typeOfSrc, JsonSerializationContext context) {
        final JsonElement element = context.serialize(src.orNull());
        final JsonArray result = new JsonArray();
        result.add(element);
        return result;
    }
}


 类似资料:
  • 我有一个具有以下属性的对象。 该对象位于库中,我不希望仅为了序列化目的而修改它,并且希望避免创建另一个DTO的成本。 我如何序列化/反序列化可选属性?可选没有默认构造函数(两个apache公共对都没有),但我不能使用InstanceCreator,也不真正了解如何创建一个TypeAdapter,它只会将序列化委托给底层的可选内容。

  • 问题内容: 我如何使用gson 2.2.4序列化和反序列化一个简单的枚举? 问题答案: 根据 GsonAPI文档 ,Gson提供了的默认序列化/反序列化,因此基本上,应使用标准和方法(与其他类型一样)对序列化和反序列化。

  • 我需要序列化/反序列化特定枚举: 我有个例外: 我如何通过GSON序列化/反序列化它?

  • 问题内容: 我在尝试序列化包含 即使我写了: 并应用: 我仍然无法序列化此类: Stacktrace :(在pastebin上完整) 有什么办法吗? 问题答案: 您的问题是那是一个。假设您使用它将在Windows PC上创建类似的实例。现在,您必须告诉GSON如何反序列化此类型: 您可以使用的另一种方法是: typeHierarchyAdapter的目的是在您希望为类型的所有子类型使用相同的表示形

  • 问题内容: 我想使用GSON将下面的Example类序列化为JSON。 我期望得到以下输出: 但是调用函数返回 看来GSON无法在Map 内序列化Map 。这是GSON的限制,还是我在这里做错了? 问题答案: Nishant的答案之所以起作用,是因为Gson的默认构造函数默认启用了所有东西,否则您将不得不使用GsonBuilder手动启用它们。 从JavaDocs: 使用默认配置构造一个Gson对

  • ClassCastException:com.google.gson.internal.LinkedTreeMap不能强制转换为java.util.HashMap 提前谢了。