领域从地图序列化数据 [英] Realm Serializing Data from Map

查看:94
本文介绍了领域从地图序列化数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆