2013-05-27 99 views
0

我想使用方法canDeserialize,因爲在那一刻反序列化我想類型的類在定製反序列化應用,如約下面的例子:如何使用方法canDeserialize從傑克遜API的ObjectMapper類?

public T deserialize(byte[] bytes) throws SerializationException { 
     bolean isAccount = this.objectMapper.canDeserialize(??????). 
      T t = null; 

      if(isAccount) 
      t = (T)this.objectMapper.readValue(bytes,Account.class); 

      else 
      t = (T) this.objectMapper.readValue(bytes, 0, bytes.length, new TypeReference<Object>(){}); 

     return t; 
    } 

在這種情況下,賬戶類有註釋 @JsonDeserialize了自定義反序列化。

+0

你想做什麼?什麼數組的字節代表?這是一個字符串?你能提供更多有關上下文和問題的信息嗎?你能證明,你如何調用這個「反序列化」方法? –

+2

是的,你需要通過一個類作爲參數的方法之一。我建議也提供一個覆蓋類型。請注意,您不需要手動處理自定義反序列化,Jackson運行時將使用'@ JsonDeserialize'檢測類並自動處理它們。 – Perception

回答

4

直接回答你的問題,你這是怎麼使用canDeserialize方法:

final ObjectMapper mapper = new ObjectMapper(); 
mapper.canDeserialize(mapper.constructType(Bean.class)); 

哪裏Bean是你的Java類的名稱進行檢查。

但是等待,您試圖解決錯誤的問題。你正在爲你的方法而努力,因爲它沒有被正確設計。通過試圖讓他們推斷出有關要實例化的類型的所有必需信息(基於參數化返回值),您會太多地詢問Java運行時(和Jackson庫)中的哪一個是。爲了解決這個問題,你應該包括代表類型的類被反序列化作爲參數的方法,大大簡化了邏輯:

public <T> T deserialize(byte[] bytes, Class<T> clazz) throws IOException, 
     JsonProcessingException { 
    return new ObjectMapper().readValue(bytes, clazz); 
} 

此時你可能已經意識到的是,上述方法提供了優於只是沒有額外的功能直接撥打ObjectMapper.readValue,所以... 只是這樣做!無需定義自定義方法,只需使用ObjectMapper即可。請記住,您不需要做任何明確的操作來觸發類的自定義反序列化。 Jackson運行時自動檢測一個類何時具有自定義的反序列化器並調用它。