有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Jackson多态集合序列化分多个步骤进行,以避免类型擦除

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

因此,我创建对象,将它们存储在映射中,将其传递给序列化整个集合的函数,然后将序列化的字符串发送给Web服务。非常简单,但正如the jackson wiki所指出的,类型信息由于java类型擦除而丢失

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


共 (1) 个答案

  1. # 1 楼答案

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

    @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();
    
        }
    
    }