Можете ли вы переопределить средства записи потоков в объектах scala @serializable? - PullRequest
8 голосов
/ 09 августа 2010

Теперь я понимаю, что объекты scala @serializable можно использовать так же, как и объект Java Serializable. В объекте Java Serializable есть методы, которые вы можете переопределить, чтобы изменить поток объектов: writeObject (ObjectOutputStream) / readObject (ObjectOutputStream).

Можете ли вы переопределить или внедрить методы в объект scala @serializable, позволяющий вам изменить способ сериализации объекта?

Ответы [ 2 ]

9 голосов
/ 09 августа 2010

Да, вы можете использовать те же методы в Scala, что и в Java:

@throws(classOf[IOException])
private def writeObject(out: ObjectOutputStream): Unit = // ...

@throws(classOf[IOException])
private def readObject(in: ObjectInputStream): Unit = // ...
3 голосов
/ 11 августа 2010

Как уже говорилось, вы можете определить свои собственные методы writeObject и readObject.

@throws(classOf[java.io.IOException])
private def writeObject(out : java.io.ObjectOutputStream) : Unit = /* your definition  here */

Однако будьте осторожны при выполнении этого для вложенных классов, объектов или признаков.

@ сериализуемая class Foo (x: Int) { @serializable объект X {def y = x} }

Если я сериализую объект X, он фактически сериализует содержащий класс Foo, поэтому он также должен быть сериализуемым. Это может быть PITA, чтобы иметь дело с пользовательскими методами сериализации, так что вот честное предупреждение.

Еще одна болевая точка - сериализация замыканий. Постарайтесь сохранить мысленную модель того, какие переменные фиксируются в сериализованных замыканиях. Убедитесь, что эти переменные - это то, что вы хотите отправить через IO!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...