1

我正在尝试编写一个类来实现KryoSerializer,以便我可以序列化对象以与 Spark 一起使用。我遇到的问题是,虽然所有类都实现了公共接口,但所有实现类都是私有的。Kryo 似乎不想让我为私有的包外类或接口定义序列化程序。

这个问题表现出来的方式是,当我尝试定义KryoSerializer类时,我收到一个错误,即class [implementation] in package graph cannot be accessed in package [same package].

我希望有人可以提供帮助,是解决此问题的策略。

我理解 Kryo 想要序列化和反序列化具体对象的原因。但是,在这种情况下,由于无论如何我都在定义自​​己KryoSerializer的,因此为接口定义序列化实际上会更有意义。有没有办法欺骗 Kryo 做正确的事?

(这会起作用的原因是,有一个相关Object函数具有使用接口获取实例并从流中写入或读取的函数。我的序列化程序本质上会包装这些函数,同时添加一些序列化格式版本信息。)

我想到的一种可能性是反射技巧。当反序列化具有私有/最终成员的类时,我们有时使用反射使私有成员可访问和可写,设置值,然后将其设置回私有/最终。我不确定是否可以为另一个打包程序中的私有类执行此操作,但即使可以,它看起来也相当丑陋且效率低下。

另一种可能性是定义扩展私有类的新类,以及一组在它们之间转换的隐式。但是,由于某些原因,这也会相当难看,并且有很多私人课程存在争议。

任何人都可以提出一种方法吗?关于我应该避免的陷阱的建议?

4

0 回答 0