【问题标题】:jackson serializer: custom serializer based on a different fieldjackson 序列化器:基于不同字段的自定义序列化器
【发布时间】:2018-07-12 21:05:53
【问题描述】:

我有一个要序列化的列表字段。 每当类被序列化时,我还想序列化我迄今为止看到的最大值或最大值。

class A {
private List<int> list;
private int max; //Math.Max(max, Collections.max(list));}

我认为我需要使用@JsonSerialize 注释,但我在此处指定的自定义序列化程序将采用列表或最大值,而不是两者。 是否可以为使用列表字段数据的最大字段添加序列化程序?

【问题讨论】:

    标签: java serialization jackson


    【解决方案1】:

    该列表是您班级中的private,因此您可以完全控制向其中添加元素的方式。即,如果您的类中没有执行操作的代码,则无法将任何内容添加到列表中。

    因此,无论代码添加(和删除,如果您这样做)元素都应该只是更新max 值作为其操作的一部分。然后在序列化时使用列表和max 上的标准序列化程序。

    如果由于某种原因您公开了列表,例如通过使用返回列表引用的方法,那么您应该继承 List&lt;whatever&gt; 并覆盖 add() 方法以跟踪最大值。

    【讨论】:

    • 我正在考虑这个问题,但我很好奇是否有更多的“防错”方法可以通过使用自定义序列化程序来做到这一点。我确实将列表泄漏到课堂之外,以便调用者进行操作。代码已经这样几年了,我不想全部更改
    • 只需创建一个嵌套类 private static class ListWithMax extends ArrayList&lt;Integer&gt; 并在内部使用它,同时仍然返回 List&lt;Integer&gt;
    • hm.. 这不会破坏旧数据的反序列化吗?
    • 可能。在确定一种方法之前,您必须进行一些实验,并且您没有在问题中分享所有细节。泄露对私有成员的引用是严重错误。您可能必须将所有现有的序列化数据转换为新格式。
    猜你喜欢
    • 2016-02-12
    • 2016-01-11
    • 1970-01-01
    • 2012-05-01
    • 2021-03-03
    • 2018-03-06
    • 2021-06-17
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多