Почему scala.Serializable не указывает никаких методов? - PullRequest
12 голосов
/ 12 июня 2011

Поскольку язык Java требовал, чтобы все члены интерфейса были общедоступными, а разработчики оригинала не хотели, чтобы «методы» java.io.Serializable были общедоступными, это было невозможно в Java.

Scala не имеет этого ограничения, но такие вещи, как readObject / writeObject, все еще не указаны в черте scala.Serializable.

Не поможет ли это разработчикам, потому что

  • у них была гарантия, что их подпись верна
  • это сделало бы доступ к этим методам менее удобным.

или я пропустил что-то важное?

Ответы [ 3 ]

5 голосов
/ 15 июня 2011

или я пропускаю что-то важное?

Да, вы делаете.

readObject / writeObject методы должны быть закрытыми и НЕ переопределятьсядля правильной работы механизма.

Они также вызываются в обратном порядке (т.е. суперкласс-> класс).Кроме того, вы хотите, чтобы метод оставался закрытым для предотвращения неправильного использования (и явных вызовов)

Механизм Serializable предлагает и другие методы: например, writeReplace + readResolve, которые обычно не используются в том же классе + readObjectNoData (это не тактак полезно).

Теперь, если вам нужен конкретный метод, взгляните на java.io.Externalizable.Он публикует свои методы, и его реализация переопределяет механизм сериализации по умолчанию.

5 голосов
/ 15 июня 2011

Ответ из фона Java, но я предполагаю, что те же рассуждения применимы к Scala: Java не требует методов, помеченных как Serializable, для реализации каких-либо методов;среда выполнения обеспечивает сам механизм сериализации.Вот почему интерфейс пуст.readObject и writeObject не являются частью Serializable не потому, что они не являются публичными, а потому, что объекты, производные от Serializable, не должны их реализовывать.

Serializable на самом деле должен быть не интерфейсом, а аннотацией (особенно потому чтокласс, производный от Serializable, вполне может не сам быть Serializable), но он был частью языка до того, как в нем появились аннотации.

0 голосов
/ 24 июня 2011

Нет способов опубликовать в сериализации. Вы можете реализовать четыре метода, но все они являются необязательными. Ваш вопрос не имеет смысла.

...