2011-01-27 67 views
16

我正在使用Jackson 1.6.4和Java JDK 6.沒有註釋的傑克遜絕對需要安裝者嗎?

我不想使用Jackson註釋;我想在沒有setter的情況下擁有不可變的Java對象。

這兩個要求似乎有衝突。

如果我添加私人setter反序列化工作正常。

我試圖不求助於我的不可變對象的私人setter - 我固執的那種方式。

我正在嘗試自定義實現VisibilityChecker以允許任何字段訪問。

但是,如果任何人有一些建議或經驗教訓,他們可以分享我會很高興聽到他們。

更新:它的工作。

構建模式,私人構造函數 - 拉布洛赫「有效的Java」。

它設置了反序列化配置和可見性,但現在很好。

public class JsonMapper 
{ 
    private static final int INITIAL_SIZE = 2048; 
    /** See http://wiki.fasterxml.com/JacksonBestPracticeThreadSafety?highlight=(\bCategoryJackson\b) */ 
    private static ObjectMapper mapper; 

    static 
    { 
     mapper = new ObjectMapper(); 

     mapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false); 
     SerializationConfig serializationConfig = mapper.getSerializationConfig(); 
     serializationConfig.setDateFormat(Person.DEFAULT_FORMATTER); 

     mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,false); 
     DeserializationConfig deserializationConfig = mapper.getDeserializationConfig(); 
     deserializationConfig.setDateFormat(Person.DEFAULT_FORMATTER); 
     deserializationConfig.enable(DeserializationConfig.Feature.AUTO_DETECT_FIELDS); 
     mapper.setVisibilityChecker(VisibilityChecker.Std.defaultInstance().withFieldVisibility(JsonAutoDetect.Visibility.ANY)); 
    } 

    public static <T> String serialize(T o) throws IOException 
    { 
     StringWriter sw = new StringWriter(INITIAL_SIZE); 
     mapper.writeValue(sw, o); 

     return sw.toString(); 
    } 

    public static <T> T deserialize(String source, Class<T> targetClass) throws IOException 
    { 
     ByteArrayInputStream stream = new ByteArrayInputStream(source.getBytes()); 
     TreeTraversingParser treeTraversingParser = new TreeTraversingParser(mapper.readTree(stream)); 
     treeTraversingParser.setCodec(mapper); 

     return treeTraversingParser.readValueAs(targetClass); 
    } 
} 
+1

如果你的課是不可改變的,傑克遜應該如何填充它們? – skaffman 2011-01-27 22:49:44

+0

建設者模式 – duffymo 2011-01-28 00:37:20

回答

17

很高興聽到你做它的工作 - 改自動檢測能見度水平的能力是非常強大的功能,但也有這麼多的功能,這是不平凡的找到所有有。

幾個附加指針:如果您不想在POJO中添加Jackson註釋,則仍然可以使用mix-in annotations。有了這個,你可以使用@JsonCreator來指定要使用的非默認構造函數,它允許真正的不可變值類型(更多關於Jackson和this article上的不可變類型)。

最後:雖然構建器模式尚未直接支持,但它已按照this Jira entry計劃。