Как сериализовать формат даты Джексона Джоды?

Я хочу сериализовать объекты в Json внутри задания обработки потока flink. Внутри задания flink все объекты должны быть сериализуемыми.

Я использую Джексона для сериализации своих объектов.

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, сериализуемым?


person CPA    schedule 08.12.2016    source источник
comment
Как именно выглядит объект, который вы пытаетесь сериализовать? Похоже, что он имеет JacksonJodaDateFormat в качестве переменной-члена, которая не является объектом, который можно преобразовать в представление JSON. Возможно, вы захотите исключить это поле, используя @JsonIgnore.   -  person Jesper    schedule 08.12.2016
comment
@Jesper Дело не в сериализации в JSON (у Джексона не должно возникнуть проблем с сериализацией JacksonJodaDateFormat, если это необходимо, хотя это было бы бесполезно). Это сериализация Java. JacksonJodaDateFormat не Serializable.   -  person Sotirios Delimanolis    schedule 08.12.2016
comment
@SotiriosDelimanolis А, да, понятно. В этом случае CPA мог бы, конечно, сделать поле transient, если это работает для его приложения.   -  person Jesper    schedule 08.12.2016
comment
@Soitirious да, это сериализация Java. Jesper, проблема в том, что поле не в моем коде, а в классе JodaModule. :/   -  person CPA    schedule 08.12.2016
comment
Почему вы сериализуете экземпляр JodaModule или экземпляр ObjectMapper? Что делаешь? Предоставьте минимально воспроизводимый пример.   -  person Sotirios Delimanolis    schedule 08.12.2016
comment
Из-за того, что Фабиан сказал в своем ответе. Flink сериализует функциональные объекты. И я использую JodaModule внутри такой функции.   -  person CPA    schedule 08.12.2016


Ответы (1)


Flink сериализует объекты данных с помощью пользовательских сериализаторов (неизвестные объекты сериализуются с помощью Kryo). Однако функциональные объекты (т. е. объекты классов, которые реализуют функциональные интерфейсы, такие как MapFunction) отправляются в кластер с сериализацией Java.

Проблема здесь, похоже, в том, что ваш класс ObjectMapper имеет несериализуемое поле. Вы можете попробовать установить для поля значение transient и либо:

1) перезаписать методы сериализации Java или 2) реализовать функцию как RichFunction и инициализировать несериализуемое поле в методе RichFunction.open(), который вызывается до обработки первой записи.

person Fabian Hueske    schedule 08.12.2016
comment
Инициализация несериализуемого объекта в функции RichFunction.open() сработала! Вы также можете сделать объект статическим. - person CPA; 12.12.2016
comment
Статические члены в функциях опасны. Они используются всеми операторами в одном диспетчере задач. Таким образом, вы должны быть уверены, что все методы потокобезопасны, иначе вы увидите исключения или странные побочные эффекты. - person Fabian Hueske; 12.12.2016