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

Noa*_*oam 7 java serialization json jackson

我们使用与Jackson的JSON序列化来公开系统的内部状态以调试属性.

默认情况下,jackson不会序列化瞬态字段 - 但我也希望将它们序列化.如何序列化这些字段?

我知道的一种方法是为这些字段提供getter - 但我不想这样做,因为我有一些我不想被调用的getX方法(例如,有一些getter改变了对象国家).

我知道我可以创建一个注释,但我真的想避免它.

所以我的问题是:有没有办法设置杰克逊序列化所有对象字段?包括短暂的.

Ger*_*ere 11

我对Jackson 2.4.3的解决方案:

  private static final ObjectMapper mapper =
        new ObjectMapper(){{

            Hibernate4Module module = new Hibernate4Module();
            module.disable(Hibernate4Module.Feature.USE_TRANSIENT_ANNOTATION);
            registerModule(module);

        }};
Run Code Online (Sandbox Code Playgroud)


Cha*_*ins 7

我不认为杰克逊支持任何类型的配置,使其能够序列化瞬态字段.添加该功能有一个悬而未决的问题,但它已经过时并且尚未得到解决(据我所知):http://jira.codehaus.org/browse/JACKSON-623

所以我的问题是:有没有办法设置杰克逊序列化所有对象字段?包括短暂的.

所以回答你的问题,没有.

其他一些Java JSON工具(如GSON)支持配置选项以序列化瞬态字段.如果您可以使用其他工具,则可以查看(对于GSON,请参阅:https://sites.google.com/site/gson/gson-user-guide).

要扩展一点,您可以尝试不同的方法.

首先,您不应该尝试序列化瞬态字段.在瞬态的所有定义之后是"不要序列化这个".不过,我可以想到一些可能需要的特定情况,或者至少方便(比如使用代码时无法修改等).尽管如此,在99%的案例中,答案是不这样做.如果需要序列化,请更改字段,使其不是瞬态的.如果您有多个使用相同字段的上下文,并且您希望将其序列化为一个(例如JSON),而不是另一个(例如java.io)中的序列化,那么您应该为这种情况创建自定义序列化程序你不想要它,而不是滥用关键字.

其次,对于使用吸气剂和"一些改变物体状态的吸气剂",你应该尽量避免这种情况.这可能会导致各种意想不到的后果.而且,从技术上讲,这不是一个吸气剂,那是一个制定者.我的意思是,如果它改变状态,你有一个mutator(setter)而不是accessor(getter),即使你按照"get"约定命名并返回一些东西.