我需要通过添加两个新参数来修改类.这个类是用Kryo序列化的.每当我停止我的流时,我目前正在持续保存与此课程相关的信息,作为RDD.当我重新启动流时,我加载了以前持久化的信息,并使用它们在我停止和重新启动之间保持一致.
由于I类持久化需要这些新参数,我通过添加new kryo.writeObject(output, object, ObjectSerializer)
和new参数来更改类和序列化器kryo.readObject(input, classOf[Object], ObjectSerializer)
.
现在,每当我重新启动流时,我都会获得一个异常:"遇到未注册的类......".
这似乎是显而易见的,因为我试图反序列化一个对象,这个对象在我停止流时我坚持的信息中没有包含.如果我删除这些数据并启动流,就好像它没有任何先前的运行一样,则不会发生异常.
有没有办法避免这种异常?也许通过指定一些默认值,以防这些参数丢失?
谢谢
编辑:
我找到了一些我以前没见过的有用的东西: Kryo问题194.
这个人通过简单地插入一个很长的定义他应该使用哪个版本的反序列化器来实现版本控制.这是一个简单的解决方案,但是,由于编写我正在编写的代码的公司没有考虑向前兼容性,我想我必须抛弃所有在新的序列化器之前保留的数据窗口.
如果有人能提出更好的解决方案,请告诉我.
编辑2:
仍然有这种情况的问题.我尝试使用此处描述的CompatibleFieldSerializer:CompatibleFieldSerializer示例
因此,通过注册此序列化程序而不是先前使用的自定义序列化程序.结果是,现在,当重新加载持久数据时,它给出了一个java.lang.NullPointerException
.如果之前没有数据持续存在,仍然没有问题.我可以启动我的流,序列化新数据,停止流,反序列化并重新启动我的流.仍然没有解决方案的线索.