【问题标题】:How to do Java serialization without Reflection?如何在没有反射的情况下进行 Java 序列化?
【发布时间】:2013-03-05 13:25:01
【问题描述】:

我正在开发一个不支持 Java 反射的 Lego Mindstorm NXT 机器人。

出于某种原因(模拟器的并行创建和实际的头脑风暴),我们想使用序列化来交换 Java 对象。

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

有什么想法吗?

我找到了this page on Zwong.de,但是源代码已经被删除了。

【问题讨论】:

  • 该人的推特名称列在该网站 (@corneliushald) 上 - 可能值得 ping 他并询问。通常这些东西是偶然丢失的,而不是设计。

标签: java serialization reflection mindstorms lejos-nxj


【解决方案1】:

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

【讨论】:

  • 我们不知道 Externalizable 接口的存在,但听起来很有希望。问题是,leJOS Java Mindstorm API 不提供 ObjectOutputStream 或 ObjectInputStream 类。如果没有这些对象,我们如何使用 Externalizable?或者我们应该在不使用反射的情况下实现自己的类?
【解决方案2】:

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

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

听起来您需要创建自己的InstantiatorStrategy,因为我不确定标准版是否支持 NXT JVM - 不过值得一试!这个我自己没试过,不过听上去理论上应该是可以的。

【讨论】:

    【解决方案3】:

    我发现了两条可能的线索。希望这些对您有所帮助。

    1) Doing Java serialization without reflection

    2)xml serialization generator for java without using reflection

    【讨论】:

    • 你第一个答案的源代码下线了,我的问题里已经提到了。
    • 我设法让谷歌缓存版本加载,这是我链接的。不过,您现在是否可以下载源代码似乎值得怀疑。也许服务器很快就会备份。
    • 请查看How to Answerfaq。你的答案必须是独立的。请改进您的答案以反映这种思维方式。
    【解决方案4】:

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

    此外,自定义序列化方法,尤其是那些使用二进制数据的方法,通常比 Serializable 提供的方法消耗更少的时间、内存和处理能力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 2010-10-08
      相关资源
      最近更新 更多