领域从地图序列化数据 [英] Realm Serializing Data from Map
问题描述
我正在使用Android的Realm,因此不得不处理地图存储.但是,Realm不支持地图,因此我在建议的此处进行了变通
I am working with Realm for Android, I had to work with storage of maps. However, Realm does not support maps and so I made a workaround for this as suggested here
但是当我将要存储的数据序列化为JSON时,输出与预期的相去甚远.
But when I am serializing the data I am storing to a JSON, the output is way off of what is expected.
期望的JSON:
{
"key1": "value1",
"key2": "value2",
"key3": "value3",
"key4": "value4"
}
我得到的是:
[{
"key": "key1",
"value": "value1"
},
{
"key": "key2",
"value": "value2"
},
{
"key": "key3",
"value": "value3"
}]
我的代码:
public class ActivityDetails extends RealmObject {
public RealmList<KeyValueStore> map;
public String bid;
public String s;
}
public class KeyValueStore extends RealmObject {
private String key;
private String value;
public void setKey(String key) {
this.key = key;
}
public void setValue(String value) {
this.value = value;
}
}
有没有一种方法可以像预期的那样将地图序列化为数据?
Is there a way to serialize the map like data as expected?
以下是完整的对象,即我的数据(符合预期)
The following is the complete object that is my data (as expected)
{
"s": "someValue",
"bid": "someValue",
"map": [
{
"key": "key1",
"value": "value1"
},
{
"key": "key2",
"value": "value2"
},
{
"key": "key3",
"value": "value3"
}
]
}
推荐答案
可能为时已晚,但是由于我试图解决相同的问题,所以我提出了编写自定义JSON序列化器/反序列化器的解决方案:
Might be too late, but since I have tried to solve same problem, I came up with solution of writing custom JSON serializer/deserializer:
public class KeyValueSerializer implements JsonSerializer<RealmList<KeyValue>>,
JsonDeserializer<RealmList<KeyValue>> {
@Override
public JsonElement serialize(RealmList<KeyValue> src,
Type typeOfSrc,
JsonSerializationContext context) {
JsonObject keyValueJson = new JsonObject();
for(KeyValue keyValue : src) {
keyValueJson.addProperty(keyValue.getKey(), keyValue.getValue());
}
return keyValueJson;
}
@Override
public RealmList<KeyValue> deserialize(JsonElement json,
Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
Type type = new TypeToken<Map<String, String>>() {}.getType();
Map<String, String> data = new Gson().fromJson(json, type);
RealmList<KeyValue> keyValues = new RealmList<>();
for (Map.Entry<String, String> entry : data.entrySet()) {
KeyValue keyValue = new KeyValue();
keyValue.setKey(entry.getKey());
keyValue.setValue(entry.getValue());
keyValues.add(keyValue);
}
return keyValues;
}
}
KeyValue
类与建议的 RealmList
是通用类型,因此不能用.class
寻址.注册TypeAdapter
并调用fromJson
方法时,使用TypeToken
获取Type
:
RealmList
is a generic type, so it can't be addressed with a .class
. Use TypeToken
to get a Type
when registering a TypeAdapter
and calling fromJson
method:
Type keyValueRealmListType = new TypeToken<RealmList<KeyValue>>() {}.getType();
Gson gson = new GsonBuilder().registerTypeAdapter(keyValueRealmListType,
new KeyValueSerializer())
.create();
RealmList<KeyValue> keyValues = gson.fromJson(keyValuesJson,
keyValueRealmListType);
据我测试,像这样的自定义序列化器/反序列化器应以首选格式读取和写入JSON,就像在问题中一样.我觉得它有点骇人听闻,但是确实可以.
As far as I have tested, a custom serializer/deserializer like this should read and write JSON in preferred format like it is in the question. I find it a bit hacky, but it does the job.
这篇关于领域从地图序列化数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!