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

Java Jackson多态集合序列化分多个步骤进行,以避免类型擦除,java,jackson,Java,Jackson,我在项目中有多态对象。我还有一个Web服务,它需要JSON中的对象。我希望将要发送的对象存储在映射中,以便稍后使用Jackson对其进行序列化。这些对象的唯一共同祖先是java对象。我注释了一些对象,以将类型信息作为属性 因此,我创建对象,将它们存储在映射中,将其传递给序列化整个集合的函数,然后将序列化的字符串发送给Web服务。非常简单,但正如所指出的,类型信息由于java类型擦除而丢失 然后,我的想法是预先序列化集合中的实际对象(当它们的实际类型已知时),并以某种方式将其存储在集合中,以便稍后

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

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

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

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

@JsonSerialize(using = PreserializedMapSerializer.class)
class PreserializedMap extends HashMap<String,String>{
}
然后序列化集合:

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

    }

}
公共静态类PreserializedMapSerializer扩展了JsonSerializer{
@凌驾
public void序列化(预序列化映射值、JsonGenerator生成器、,
SerializerProvider提供程序)引发IOException,
JsonProcessingException{
generator.writeStartObject();
for(条目:value.entrySet()){
generator.writeObjectFieldStart(entry.getKey());
generator.writeRaw(entry.getValue().substring(1,entry.getValue().length()-1));
generator.writeEndObject();
}
generator.writeEndObject();
}
}

你读过关于
Externalizable
的书吗?它允许你验证序列化方法,从那里你可以输入一些关于类的信息来正确返回类。你知道如何使用jackson吗?不幸的是,没有,通常你只是实现Externalizable,但对于杰克逊来说,这可能行不通
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();

    }

}