簡體   English   中英

如何使用jackson序列化瞬態字段?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM