Вам нужно зарегистрировать все реализации интерфейса в Kryo?

При использовании Kryo обычно рекомендуется регистрировать классы, которые вы собираетесь сериализовать, чтобы имя класса не нужно было включать в сериализованные данные.

Но в иерархии классов фактический класс реализации может быть неочевидным. Например, если у меня есть набор данных Spark, содержащий Vector, конкретный класс этих объектов может быть либо DenseVector, либо SparseVector.

Когда я регистрируюсь на занятия в Kryo, должен ли я:

  1. Зарегистрируйте класс в соответствии с объявленным типом набора данных (вектор)
  2. Зарегистрируйте конкретные классы (DenseVector и SparseVector)
  3. Все вышеперечисленное на всякий случай?

Дополнительный вопрос: если вектор появляется как поле в классе кортежа или случая, нужно ли вам также регистрировать продукт (например, Tuple2[Vector, Int])?


person Matt    schedule 07.09.2018    source источник


Ответы (1)


Ответ на главный вопрос

Ответ... нет 2 :) Другими словами:

  • вам нужно зарегистрировать только классы concrete и
  • вам необходимо зарегистрировать каждый конкретный класс, с которым вы можете столкнуться1.

К сожалению, у меня нет ссылки на документацию, подтверждающую это прямо сейчас (я знаю это по опыту).


1 Однако существует особый случай, когда вы можете зарегистрировать только класс abstract для целей сериализации/десериализации (но не для Kryo.copy()). Это случай, когда:

  1. ваша сериализация одинакова для всех подклассов, и
  2. во время десериализации вы можете решить, какой подкласс вернуть на основе данных.

Посмотрите на ImmutableListSerializer от Мартина Гроцке. В registerSerializers, он регистрирует только ImmutableList класс для целей сериализации/десериализации, потому что:

  1. сериализация такая же, и
  2. во время десериализации ImmutableList.copyOf() заботится о возврате правильного подкласса.

Ответ на бонусный вопрос

Если Vector появляется в кортеже или классе case, вам необходимо зарегистрировать соответствующий класс (например, Tuple2).

Обратите внимание, что универсальные типы здесь не имеют значения, если вы сериализуете с помощью Kryo.writeClassAndObject (например, ImmutableListSerializer расширяет Serializer<ImmutableList<Object>>).

person Tomasz Linkowski    schedule 08.09.2018