[英]How to serialize transient fields using jackson?
我們使用 JSON 序列化與 Jackson 來公開系統的內部狀態以調試屬性。
默認情況下,jackson 不會序列化瞬態字段 - 但我也希望序列化它們。 如何序列化這些字段?
我知道的一種方法是為這些字段提供 getter - 但我不想這樣做,因為我有一些不想被調用的 getX 方法(例如,有一些 getter 會更改對象狀態 )。
我知道我可以創建一個注釋,但我真的想避免它。
所以我的問題是:有沒有辦法設置 jackson 來序列化所有對象字段? 包括瞬態的。
我對 Jackson 2.4.3 的解決方案:
private static final ObjectMapper mapper =
new ObjectMapper(){{
Hibernate4Module module = new Hibernate4Module();
module.disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION);
registerModule(module);
}};
我認為 Jackson 不支持任何類型的配置以使其能夠序列化瞬態字段。 添加該功能有一個未解決的問題,但它已經過時且尚未解決(據我所知): http : //jira.codehaus.org/browse/JACKSON-623
所以我的問題是:有沒有辦法設置 jackson 來序列化所有對象字段? 包括瞬態的。
所以要回答你的問題,不。
其他一些 Java JSON 工具(例如 GSON)確實支持用於序列化瞬態字段的配置選項。 如果您可以使用其他工具,您可以研究一下(對於 GSON,請參閱: https : //sites.google.com/site/gson/gson-user-guide )。
為了稍微擴展,您可以嘗試不同的方法。
首先,您不應該嘗試序列化瞬態字段。 畢竟瞬態的定義是“不要序列化這個”。 盡管如此,我還是可以想到一些可能需要或至少方便的特定情況(例如在處理無法修改的代碼時等)。 盡管如此,在 99% 的情況下,答案是不要那樣做。 如果您需要序列化它,請更改該字段,使其不是暫時的。 如果您有多個使用相同字段的上下文,並且您希望它在一個(例如 JSON)中序列化,而不在另一個(例如 java.io)中序列化,那么您應該為以下情況創建一個自定義序列化程序你不想要它,而不是濫用關鍵字。
其次,對於使用 getter 並擁有“一些改變對象狀態的 getter”,您也應該盡量避免這種情況。 這可能會導致各種意想不到的后果。 而且,從技術上講,這不是 getter,而是 setter。 我的意思是,如果它改變狀態,即使你按照“get”約定命名它並返回一些東西,你也會得到一個修改器(setter)而不是訪問器(getter)。
您可以為該瞬態字段創建自定義 getter 並使用 @XmlElement 屬性。 那個吸氣劑的名字並不重要。
例如:
public class Person {
@XmlTransient private String lastname;
@XmlElement(name="lastname")
public String getAnyNameOfMethod(){
return lastname;
}
}
讓 Jackson 序列化屬性的另一種方法是在其上方添加@JsonProperty
注釋。 我想這是更好的方法,因為您不需要禁用所有@Transient
字段的默認行為,就像在 Gere 的回答中一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.