2012-12-18 71 views
3

我需要有功能,它允許我序列化Map<CustomType1, CustomType2>。 我創建了從JsonSerializer繼承的自定義序列化器。 我也創建了簡單的模塊並將其註冊到我的映射器中;傑克遜映射序列化,自定義序列化的關鍵不調用

SimpleModule myModule = new SimpleModule("myModule"); 
myModule.addKeySerializer(CustomType1.class, new CustomType1Serializer()); 
myModule.addSerializer(CustomType1.class, new CustomType1Serializer()); 
mapperInstance.registerModule(myModule); 

當我剛剛序列化CustomType1的一個實例,它完美的作品,但是當我創建的地圖,並試圖將其序列化,比傑克遜跳過我的串行和使用StdKeySerializer如何解決?

感謝您的關注。

回答

5

這個問題似乎與傑克遜處理通用對象有關。解決此問題的一種方法是使用超級類型標記來嚴格定義地圖類型。圖說:

final ObjectMapper mapper = new ObjectMapper(); 

final SimpleModule module = new SimpleModule("myModule", 
     Version.unknownVersion()); 
module.addKeySerializer(CustomType1.class, new CustomType1Serializer()); 
mapper.registerModule(module); 

final MapType type = mapper.getTypeFactory().constructMapType(
     Map.class, CustomType1.class, CustomType2.class); 
final Map<CustomType1, CustomType2> map = new HashMap<CustomType1, CustomType2>(4); 
final ObjectWriter writer = mapper.writerWithType(type); 
final String json = writer.writeValueAsString(map); 
+0

非常適合您的幫助=) – Ph0en1x

0

addSerializer和addKeySerializer只是兩種類型,只有簡單的,非POJO類型的處理可序列化的。要爲更復雜的類型(例如映射和集合)定製序列化,您需要在模塊上使用.setSerializerModifier,並使用BeanSerializerModifier來覆蓋modifyMapSerializer方法並返回您的自定義串行器。