【问题标题】:Gson: Change the way Map-Keys are being serializedGson:改变 Map-Keys 被序列化的方式
【发布时间】:2016-02-01 20:30:58
【问题描述】:

好的,我有一个要保存的Map<Vector3i,String>,问题是我只需要 x,z 值,所以结果应该是这样的:

{
  "1,2": "test"
  "13,5": "test"
  "9,4": "test"
}

那是我的JsonSerializer<Vector3i>:

public class Vector3iAdapter implements JsonSerializer<Vector3i> {
     @Override
     public JsonElement serialize(Vector3i src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(src.getX()+","+ src.getZ());
     }
}

但这就是输出的样子:

{
  "(1, 0, 2)": "test"
  "(13, 0, 5)": "test"
  "(9, 0, 4)": "test"
}

由于序列化一个在Map 中不能作为键的Vector3i 可以按预期工作,我在问,为什么它的行为不同以及我将如何解决这个问题。

【问题讨论】:

    标签: java serialization gson


    【解决方案1】:

    我认为在您的 Gson.Builder 上调用 enableComplexMapKeySerialization() 应该可以解决问题。来自the Gson documentation:

    仅当映射键在其序列化 JSON 形式中是复杂类型(即非原始)时,启用此功能才会更改序列化形式。 map 序列化的默认实现在 key 上使用 toString();但是,当它被调用时,以下情况之一适用......

    另外,如果你打算稍后也反序列化 JSON,你应该阅读这个答案:https://stackoverflow.com/a/14677564/763935

    【讨论】:

    • 谢谢 :) 我已经反序列化了 Vector,但我没有在示例中包含它。另外:enableComplexMapKeySerialization() 是否会以某种方式降低性能?如果是这样,我只会在需要时使用它。
    • 不幸的是,我不知道性能影响。我想会有一些影响 - 但我认为你必须衡量这种影响才能做出明智的决定......
    猜你喜欢
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多