2016-02-01 2 views
1

Итак, у меня есть Map<Vector3i,String>, который я хочу сохранить, проблема в том, что мне нужны только значения x, z, поэтому результат должен выглядеть примерно так:Gson: Измените способ создания карт-ключей

{ 
    "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" 
} 

Поскольку сериализация Vector3i, которая не работает как ключ в Map, работает по назначению, я спрашиваю, почему она ведет себя по-другому и как я это исправит.

ответ

2

Я думаю, что вызов enableComplexMapKeySerialization() на вашем Gson.Builder должен сделать трюк. От the Gson documentation:

Включения этой функции будет меняться только сериализированная формой, если ключ карты представляет собой сложный тип (т.е. непримитивный) в последовательной форме JSON. По умолчанию реализация сериализации карты использует toString() для ключа; Однако, когда это называется, то один из следующих случаев применяются ...

Кроме того, если вы планируете также десериализации JSON позже, вы должны прочитать этот ответ: https://stackoverflow.com/a/14677564/763935

+0

Спасибо :) Я 'm уже также десериализует Вектор, но я не включил его в пример. Кроме того: «enableComplexMapKeySerialization()« снижает производительность в некотором роде? Если это так, я бы использовал его, только если это необходимо. – MyNameIsHans

+0

К сожалению, я понятия не имею о влиянии производительности. Я предполагаю, что будет какое-то влияние *, но я думаю, что вам нужно будет измерить это влияние, чтобы принять взвешенное решение ... –

Смежные вопросы