Я теперь понимаю, что scala @serializable объекты может использоваться то же в качестве Java сериализуемый объект. В Java сериализуемый объект там является методами, которые можно переопределить, чтобы измениться как объектные потоки: writeObject (ObjectOutputStream) / readObject (ObjectOutputStream).
Можно ли переопределить или ввести ли методы в scala @serializable объект, разрешающий Вам измениться, как объект сериализирует?
Да, вы можете использовать те же методы в 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 */
Однако будьте осторожны при выполнении этого с вложенными классами, объектами или характеристиками.
@serializable class Foo (x: Int) { @serializable объект X {def y = x} }
Если я сериализую объект X, он фактически сериализует содержащий его класс Foo, поэтому он также должен быть сериализуемым. Это может быть PITA, с которым нужно иметь дело в пользовательских методах сериализации, так что вот справедливое предупреждение.
Другой проблемой может быть сериализация закрытия. Постарайтесь сохранить ментальную модель того, какие переменные фиксируются в сериализованных замыканиях. Убедитесь, что эти переменные - это то, что вы хотите отправить через ввод-вывод!