2013-03-05 72 views
7

我正在研究Lego Mindstorm NXT机器人,它不支持Java反射。如何在没有反射的情况下进行Java序列化?

由于某种原因(模拟器和实际的mindstorm的并行创建),我们希望使用序列化来交换Java对象。

问题是序列化使用反射,而mindstorm上的JVM不支持反射。

任何想法?我发现this page on Zwong.de,但源代码已被删除。

+1

这家伙的Twitter名字被列在那个网站(@corneliushald) - 可能值得他发问并询问。通常情况下,这些事情不仅仅是设计失误。 – berry120 2013-03-05 13:38:43

回答

1

我相信Kryo支持可反序的实例化可序列化的对象。快速查看他们的主页似乎证实了这一点:

当无法使用ReflectASM或反射时,可以配置Kryo以使用InstantiatorStrategy来处理创建类的实例。 Objenesis提供了StdInstantiatorStrategy,它使用JVM特定的API来创建一个类的实例,而不用调用任何构造函数。这适用于许多JVM。

听起来就像你需要创建自己的InstantiatorStrategy一样,因为我不确定标准的NXT JVM是否支持 - 值得一试!我自己并没有尝试过,但听起来理论上应该是可能的。

0

我发现了两个可能的线索。希望这些对你有一些帮助。

1)Doing Java serialization without reflection

2)xml serialization generator for java without using reflection

+1

你的第一个答案的源代码是离线的,我已经在我的问题中提到过它。 – 2013-03-05 13:38:38

+0

我设法让Google缓存的版本加载,这是我链接的内容。尽管你现在可以下载源代码,但这看起来令人怀疑。也许服务器很快就会恢复。 – 2013-03-05 13:42:05

+2

请看[回答]和[faq]。你的答案必须是独立的。请改善您的答案以反映这种思维方式。 – 2013-03-05 13:57:01

0

序列化和反序列化是简单地写作的一种方式和读取对象。您始终可以编写自己的方法,将所有对象数据写入/读取字符串/文件/流。此外,自定义序列化方法,特别是使用二进制数据的自定义序列化方法,通常比由Serializable提供的时间,内存和处理能耗要少。

1

使类实现Externalizable,然后ObjectOuputStream.writeObject()/的readObject()将调用的writeExternal(的ObjectOutput出)/的readExternal(的ObjectInput)在你的对象directy,而无需使用反射

+0

我们不知道Externalizable接口的存在,但听起来很有希望。问题是,leJOS Java Mindstorm API不提供ObjectOutputStream或ObjectInputStream类。我们如何在没有这些对象的情况下使用Externalizable?或者我们应该实现自己的类而不使用反射? – 2013-03-05 14:55:08