Вам нужно зарегистрировать все реализации интерфейса с Kryo? - PullRequest
0 голосов
/ 07 сентября 2018

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

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

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

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

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

1 Ответ

0 голосов
/ 08 сентября 2018

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

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

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

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


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

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

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

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

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

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

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

...