【问题标题】:How to serialize Jackson Joda Date Format?如何序列化 Jackson Joda 日期格式?
【发布时间】:2016-12-08 15:46:02
【问题描述】:

我想在 flink 流处理作业中将对象序列化为 Json。在 flink 作业中,所有对象都需要可序列化。

我正在使用 Jackson 来序列化我的对象。

final ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JodaModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

当我使用这个时,我得到以下异常:

java.io.NotSerializableException: com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat

如何使包含 joda 模块的对象映射器可序列化?

【问题讨论】:

  • 您尝试序列化的对象到底是什么样的?看起来它有一个JacksonJodaDateFormat 作为成员变量,它不是可以转换为 JSON 表示的对象。您可能希望使用 @JsonIgnore 排除该字段。
  • @Jesper 这不是序列化为 JSON 的问题(如果需要,Jackson 序列化 JacksonJodaDateFormat 应该没有问题,尽管那没有用处)。这是Java序列化。 JacksonJodaDateFormat 不是 Serializable
  • @SotiriosDelimanolis 啊,是的,我明白了。在这种情况下,CPA 当然可以填写 transient 字段,如果这适用于他的申请。
  • @Soitirious 是的,它是 java 序列化。 Jesper 的问题是,该字段不在我的代码中,而是在 JodaModule 类中。 ://
  • 为什么要序列化JodaModule 实例或ObjectMapper?你在做什么?请提供minimal reproducible example

标签: java json serialization jackson apache-flink


【解决方案1】:

Flink 使用自定义序列化器序列化数据对象(未知对象使用 Kryo 序列化)。但是,函数对象(即实现函数接口的类的对象,例如 MapFunction)通过 Java 序列化传送到集群。

这里的问题似乎是您的ObjectMapper 类有一个不可序列化的字段。您可以尝试将字段设置为 transient 或者:

1) 覆盖 Java 序列化方法或 2) 将函数实现为RichFunction,并在处理第一条记录之前调用的RichFunction.open()方法中初始化不可序列化字段。

【讨论】:

  • 在 RichFunction.open() 函数中初始化不可序列化对象有效!您还可以将对象设为静态。
  • 函数中的静态成员是危险的。它们由同一任务管理器上的所有操作员共享。因此,您需要确保所有方法都是线程安全的,否则您会看到异常或奇怪的副作用。
猜你喜欢
  • 2016-02-18
  • 2014-01-06
  • 2011-11-23
  • 2018-03-14
  • 2013-09-25
  • 2014-07-07
  • 2016-07-24
  • 1970-01-01
  • 2017-01-21
相关资源
最近更新 更多