如何在不使用反射的情况下进行Java序列化?

7
我正在开发一款乐高Mindstorm NXT机器人,它不支持Java反射。
由于某种原因(同时创建模拟器和实际mindstorm),我们希望使用序列化来交换Java对象。
问题在于序列化使用反射,而mindstorm上的JVM不支持。
有什么想法吗?
我找到了这个页面在Zwong.de上,但源代码已被删除。

1
那个人的 Twitter 用户名在那个网站上列出了(@corneliushald)- 可能值得联系他并询问。通常这些东西丢失是意外而非设计所致。 - Michael Berry
4个回答

4
让你的类实现Externalizable接口,然后调用ObjectOuputStream.writeObject() / readObject()方法将直接在你的对象上调用writeExternal(ObjectOutput out) / readExternal(ObjectInput)方法,而不使用反射。

我们之前不知道 Externalizable 接口的存在,但它听起来很有前途。问题是,leJOS Java Mindstorm API 没有提供 ObjectOutputStream 或 ObjectInputStream 类。那么,在没有这些对象的情况下,我们如何使用 Externalizable 呢?或者,我们应该实现自己的类而不使用反射吗? - Steven Roose

1
我相信Kryo支持无需反射实例化可序列化对象。从他们的主页上快速浏览似乎也证实了这一点:
引用: 当无法使用ReflectASM或反射时,可以配置Kryo使用InstantiatorStrategy处理创建类的实例。Objenesis提供了StdInstantiatorStrategy,它使用特定于JVM的API在不调用任何构造函数的情况下创建类的实例。这适用于许多JVM。
从这个描述来看,似乎需要创建自己的InstantiatorStrategy,因为我不确定标准InstantiatorStrategy是否支持NXT JVM-尽管值得一试!我自己没有尝试过这个,但从理论上来说应该是可能的。

0

1
你的第一个回答的源代码已经下线了,我在我的问题中已经提到了。 - Steven Roose
我设法加载了Google缓存版本,这就是我提供的链接。不过现在似乎很难下载源代码。也许服务器很快就会恢复。 - Justin Carter
2
请查看[答案]和[常见问题解答]。您的答案必须是自包含的。请改进您的答案以反映这种思考方式。 - Hugo Dozois

0

序列化和反序列化只是一种写入和读取对象的方法。您可以编写自己的方法,将所有对象数据写入/从字符串/文件/流中读取。

此外,定制的序列化方法,特别是使用二进制数据的方法,通常比Serializable提供的方法更节省时间、内存和处理能力。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接