2

我有一个存储 Long 值和 JSONArray 的类。

Class SomeClass {
    private Long longValue;
    private JSONArray jsonArray;
    //Default and parameterised constructors.
    //Getters and Setters.
}

我将这些值存储在 NavigableMap<?, SomeClass> 中。? - 字符串/长。我从 MapDB 得到一个 treeMap 如下:

private DB mapDB = MapDBUtil.getMapDB(); //Opening or creating and getting MapDB DB object
NavigableMap<Long,SomeClass> treeMap = mapDB.treeMap(treeName).keySerializer(Serializer.LONG).valueSerializer(Serializer.ELSA).createOrOpen();

当我尝试为获得的地图添加一些价值时,请说:

SomeClass instance = new SomeClass("Hello", jsonArray);
treeMap.put("test", instance);

我得到org.mapdb.DBException$SerializationError。我认为这个问题是由于序列化 JSONArray 造成的。我想实现自定义序列化程序或使用其他方式来序列化和存储这些数据。我尝试在“SomeClass”中实现 Serializable 和 ElsaSerializer ,但这两个似乎都不起作用。我也尝试在实现 Serializable 接口时使用Serializer.JAVA,但这也不起作用。我不确定我做错了什么。任何帮助将非常感激。

4

1 回答 1

0

我最终通过实现自定义序列化程序并按如下方式使用它来修复它:

Class SomeClassSerialzer extends GroupSerializerObjectArray<SomeClass> {
@Override
    public void serialize(DataOutput2 dataOutput2, SomeClass someClass) throws IOException {
        dataOutput2.writeLong(someClass.getLong());
        dataOutput2.writeUTF(threatSourceData.getJSONArray().toString());
    }

    @Override
    public SomeClass deserialize(DataInput2 dataInput2, int i) throws IOException {
        JSONArray jsonArray = null;
        Long longValue = dataInput2.readLong();
        try {
            categories = new JSONArray(dataInput2.readUTF());
        } catch (JSONException ignored) {
        }
        return new SomeClass(reputation, categories);
    }
}

从 MapDB 获取 BTreeMap 时,使用SomeClassSerialzer如下:

NavigableMap<Long,SomeClass> treeMap = mapDB.treeMap(treeName).keySerializer(Serializer.LONG).valueSerializer(new ThreatSourceDataSerializer()).createOrOpen();
于 2020-07-06T03:49:59.247 回答