Можно ли переопределить записи потоков в scala @serializable objects?


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

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

2 7

2 ответа:

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

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

@throws(classOf[IOException])
private def readObject(in: ObjectInputStream): Unit = // ...

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

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

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

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

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

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