2014-02-28 31 views
3

我想序列化使用混合的集合,但杰克逊不会保存类型信息。这是一个基本的测试说明会发生什么:错误序列化与杰克逊类型集合

public class CollectionSerializationTest { 

    interface Common extends Serializable { 

    } 

    class A implements Common { 
     private static final long serialVersionUID = 1L; 
    } 

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") 
    @JsonSubTypes({ @JsonSubTypes.Type(value = A.class, name = "CODE") }) 
    class AMixIn { 

    } 

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") 
    @JsonSubTypes({ @JsonSubTypes.Type(value = B.class, name = "CODE") }) 
    class BMixIn { 

    } 

    class B implements Common { 
     private static final long serialVersionUID = 1L; 
    } 

    @Test 
    public void test() throws JsonGenerationException, JsonMappingException, 
      IOException { 
     ObjectMapper om = new ObjectMapper(); 
     List<Common> list = new ArrayList<Common>(); 
     A a = new A(); 
     B b = new B(); 
     list.add(a); 
     list.add(b); 
     om.getSerializationConfig().addMixInAnnotations(A.class, AMixIn.class); 
     om.getSerializationConfig().addMixInAnnotations(B.class, BMixIn.class); 
     System.out.println(om.writeValueAsString(list)); // Outputs [{},{}] 
     System.out.println(om.writeValueAsString(a));// Outputs {"type":"CODE"} 
    } 

} 

如何实现对第一输出的输出[{"type":"CODE"},{"type":"CODE"}]

回答

1

我不知道它是否是最简单的解决方案,但我认为你可以这样做:

  1. 创建新的List实现
  2. 写串行的新型
  3. 使用此类型在你的POJO类
延伸 ArrayList

新的Java类:

@JsonSerialize(using = JacksonListSerializer.class) 
class JacksonList<E> extends ArrayList<E> { 

    private static final long serialVersionUID = 1L; 
} 

串行上面类:

class JacksonListSerializer extends JsonSerializer<JacksonList<?>> { 

    @Override 
    public void serialize(JacksonList<?> list, JsonGenerator generator, SerializerProvider provider) 
      throws IOException, JsonProcessingException { 
     generator.writeStartArray(); 
     if (list != null) { 
      for (Object item : list) { 
       generator.writeObject(item); 
      } 
     } 
     generator.writeEndArray(); 
    } 
} 

现在,你可以在你的榜样使用这个列表:

public static void main(String[] args) throws IOException { 
    ObjectMapper om = new ObjectMapper(); 
    List<Common> list = new JacksonList<Common>(); 
    list.add(new A()); 
    list.add(new B()); 
    om.addMixInAnnotations(A.class, AMixIn.class); 
    om.addMixInAnnotations(B.class, BMixIn.class); 
    System.out.println(om.writeValueAsString(list)); 
    System.out.println(om.writeValueAsString(new A())); 
} 

上面的例子打印:

[{"type":"CODE"},{"type":"CODE"}] 
{"type":"CODE"}