4

我在一个项目中有多态对象。我还有一个需要 JSON 对象的网络服务。我希望将要发送的对象存储在 Map 中,以便稍后与 Jackson 进行序列化。这些对象的唯一共同祖先是 java 对象。我注释了一些对象以包含类型信息作为属性。

因此,我创建了对象,将它们存储在地图中,将其传递给序列化整个集合的函数,然后将序列化的字符串发送到 Web 服务。非常简单,但正如杰克逊 wiki指出的那样,由于 java 类型擦除,类型信息会丢失。

然后我的想法是预序列化集合中的实际对象(当它们的实际类型已知时),并将其以某种方式存储在集合中,以便稍后使用这些预序列化字符串序列化整个集合。这有可能吗?或者是否有任何解决方法不需要在序列化时知道实际类型?

4

1 回答 1

0

没关系,我创建了一个自定义序列化程序和一个自定义类型:

@JsonSerialize(using = PreserializedMapSerializer.class)
class PreserializedMap extends HashMap<String,String>{
}

并预序列化对象:

PreserializedMap map = new PreserializedMap();
...
map.put("device",objectMapper.writeValueAsString(device));

然后序列化集合:

objectMapper.writeValueAsString(map);

序列化器是:

public static class PreserializedMapSerializer extends JsonSerializer<PreserializedMap>         {

    @Override
    public void serialize(PreserializedMap value, JsonGenerator generator, 
        SerializerProvider provider) throws IOException,
            JsonProcessingException {

        generator.writeStartObject();
        for(Entry<String,String> entry : value.entrySet()){
            generator.writeObjectFieldStart(entry.getKey());
            generator.writeRaw(entry.getValue().substring(1, entry.getValue().length()-1));
            generator.writeEndObject();
        }
        generator.writeEndObject();

    }

}
于 2013-05-25T15:05:44.757 回答