Я столкнулся с несколькими сериализуемыми исключениями и провел поиск в Интернете и документации Flink; есть некоторые известные решения, такие как переходный процесс, расширение Serializable и т. д. Каждый раз происхождение исключения очень ясно, но в моем случае я не могу найти, где именно оно не сериализовано.
В: Как мне отладить такое исключение?
А.скала:
class executor ( val sink: SinkFunction[List[String]] {
def exe(): Unit = {
xxx.....addSink(sinks)
}
}
Б.скала:
class Main extends App {
def createSink: SinkFunction[List[String]] = new StringSink()
object StringSink {
// static
val stringList: List[String] = List()
}
// create a testing sink
class StringSink extends SinkFunction[List[String]] {
override def invoke(strs: List[String]): Unit = {
// add strs into the variable "stringList" of the compagin object StringSink
}
}
new executor(createSink()).exe()
// then do somethings with the strings
}
Исключение составляет:
Реализация SinkFunction не сериализуема. Объект, вероятно, содержит или ссылается на несериализуемые поля.
Два подозрительных момента, которые я обнаружил:
- Экземпляр
StringSink
передается в другой файл. - В классе
StringSink
он использует статическую переменнуюstringList
своего объекта compagin.