我需要通过添加两个新参数来修改一个类。这个类是用Kryo序列化的。
我目前将与此类相关的信息作为RDD之一持久化,每次停止流时都会这样做。
当我重新启动流时,我加载之前持久化的信息,并使用它们以保持停止和重新启动时的一致性。
由于我持久化的类需要这些新参数,所以我通过添加新的kryo.writeObject(output, object, ObjectSerializer)和kryo.readObject(input, classOf[Object], ObjectSerializer)来更改类和序列化程序以支持新参数。
现在,每当我重新启动流时,都会出现异常:“遇到未注册的类...”。
这似乎很明显,因为我尝试反序列化一个不包含在我停止流时持久化的信息中的对象。 如果我删除这些数据并像没有任何先前运行一样启动流,则不会发生异常。
有没有办法避免这种异常? 也许可以通过在缺少这些参数时指定一些默认值来实现?
我发现了一些有用的东西,以前没有看到过:Kryo issue 194。
这个人通过简单地插入一个长整型来实现版本控制,以确定应该使用哪个版本的反序列化器。虽然这是一个简单的解决方案,但由于编写我正在工作的代码的公司没有考虑向前兼容性,我想我不得不放弃之前持久化的所有数据。
请告诉我是否有人能提供更好的解决方案。
编辑2:
仍然遇到这种情况的问题。 我尝试使用CompatibleFieldSerializer,如此描述:CompatibleFieldSerializer Example 因此,注册这个序列化程序而不是先前使用的自定义序列化程序。 结果是,现在重新加载持久化数据时,它会产生java.lang.NullPointerException。 如果没有先前持久化的数据,则仍然没有问题。我可以启动我的流,序列化新数据,停止流,反序列化并重新启动我的流。 仍然没有解决方法。
由于我持久化的类需要这些新参数,所以我通过添加新的kryo.writeObject(output, object, ObjectSerializer)和kryo.readObject(input, classOf[Object], ObjectSerializer)来更改类和序列化程序以支持新参数。
现在,每当我重新启动流时,都会出现异常:“遇到未注册的类...”。
这似乎很明显,因为我尝试反序列化一个不包含在我停止流时持久化的信息中的对象。 如果我删除这些数据并像没有任何先前运行一样启动流,则不会发生异常。
有没有办法避免这种异常? 也许可以通过在缺少这些参数时指定一些默认值来实现?
我发现了一些有用的东西,以前没有看到过:Kryo issue 194。
这个人通过简单地插入一个长整型来实现版本控制,以确定应该使用哪个版本的反序列化器。虽然这是一个简单的解决方案,但由于编写我正在工作的代码的公司没有考虑向前兼容性,我想我不得不放弃之前持久化的所有数据。
请告诉我是否有人能提供更好的解决方案。
编辑2:
仍然遇到这种情况的问题。 我尝试使用CompatibleFieldSerializer,如此描述:CompatibleFieldSerializer Example 因此,注册这个序列化程序而不是先前使用的自定义序列化程序。 结果是,现在重新加载持久化数据时,它会产生java.lang.NullPointerException。 如果没有先前持久化的数据,则仍然没有问题。我可以启动我的流,序列化新数据,停止流,反序列化并重新启动我的流。 仍然没有解决方法。