【问题标题】:Realm Serializing Data from Map领域从地图序列化数据
【发布时间】:2017-02-06 06:24:25
【问题描述】:

我正在使用适用于 Android 的 Realm,我必须使用地图存储。但是,Realm 不支持地图,所以我按照建议 here

解决了这个问题

但是,当我将要存储的数据序列化为 JSON 时,输出与预期相差甚远。

预期的 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;
    }
}

有没有办法像预期的那样序列化地图之类的数据?

编辑:以下是我的数据的完整对象(如预期的那样)

{
  "s": "someValue",
  "bid": "someValue",
  "map": [
    {
      "key": "key1",
      "value": "value1"
    },
    {
      "key": "key2",
      "value": "value2"
    },
    {
      "key": "key3",
      "value": "value3"
    }
  ]
}

【问题讨论】:

  • 什么是ActivityDetails?这个问题不完整。
  • ActivityDetails 是一种用于存储数据的模型,如 geisshirt 在stackoverflow.com/questions/35311755/… 中的回答所示,我在问题中提供了该链接。但是,我认为它不能解决任何问题,或者这会使问题不完整。
  • 您使用的是什么序列化程序?格森?
  • 是的,序列化器是Gson
  • 您可以设置独占策略并编写自定义序列化程序来解决此问题。

标签: java android json realm


【解决方案1】:

可能为时已晚,但由于我试图解决同样的问题,我想出了编写自定义 JSON 序列化器/反序列化器的解决方案:

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 类遵循与建议的here 相同的地图表示:

public class KeyValue extends RealmObject {
    private String key;
    private String value;

    public KeyValue() {

    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

RealmList 是一个泛型类型,所以它不能用.class 来寻址。注册TypeAdapter并调用fromJson方法时,使用TypeToken获取Type

Type keyValueRealmListType = new TypeToken<RealmList<KeyValue>>() {}.getType();
Gson gson = new GsonBuilder().registerTypeAdapter(keyValueRealmListType, 
                                             new KeyValueSerializer())
           .create();

RealmList<KeyValue> keyValues = gson.fromJson(keyValuesJson,
                                              keyValueRealmListType);

据我测试,像这样的自定义序列化器/反序列化器应该像问题中那样以首选格式读取和写入 JSON。我觉得它有点 hacky,但它确实有效。

【讨论】:

    【解决方案2】:

    如果

    {
        "key": "key1",
        "value": "value1"
    }
    

    这代表你的整个数据,那么这应该是你的整个 RealmModel。

    public class MyObject extends RealmObject {
        @PrimaryKey
        private String key;
    
        private String value;
    
        // getters setters
    }
    

    【讨论】:

    • 我不这么认为,从上面的ActivityDetails类可以看出,变量“map”只是整个数据的一部分,这可以理解为json中的数组,还有其他 K-V 对。
    • 这在使用 Gson 序列化时不会输出想要的结果。
    • "map" is just a part of the entire data 这正是我说这是一个不完整的问题的原因。不知道架构很难设计架构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多