我正在开发一个不支持 Java 反射的 Lego Mindstorm NXT 机器人。
出于某种原因(模拟器的并行创建和实际的头脑风暴),我们想使用序列化来交换 Java 对象。
问题是序列化使用了反射,mindstorm上的JVM不支持。
有任何想法吗?
我在 Zwong.de 上找到了这个页面,但源代码已被删除。
我正在开发一个不支持 Java 反射的 Lego Mindstorm NXT 机器人。
出于某种原因(模拟器的并行创建和实际的头脑风暴),我们想使用序列化来交换 Java 对象。
问题是序列化使用了反射,mindstorm上的JVM不支持。
有任何想法吗?
我在 Zwong.de 上找到了这个页面,但源代码已被删除。
让你的类实现 Externalizable,然后 ObjectOuputStream.writeObject() / readObject() 将在你的对象上直接调用 writeExternal(ObjectOutput out) / readExternal(ObjectInput),而不使用反射
我相信Kryo支持可序列化对象的无反射实例化。快速浏览他们的主页似乎证实了这一点:
当无法使用 ReflectASM 或反射时,可以将 Kryo 配置为使用 InstantiatorStrategy 来处理创建类的实例。Objenesis 提供了 StdInstantiatorStrategy,它使用 JVM 特定的 API 来创建类的实例,而根本不需要调用任何构造函数。这适用于许多 JVM。
听起来你需要创建自己的InstantiatorStrategy
,因为我不确定标准的是否支持 NXT JVM - 不过值得一试!我自己没有尝试过,但听起来理论上应该是可能的。
序列化和反序列化只是一种写入和读取对象的方式。您始终可以编写自己的方法,将所有对象数据写入/读取字符串/文件/流。
此外,自定义序列化方法,尤其是那些使用二进制数据的方法,通常比 Serializable 提供的方法消耗更少的时间、内存和处理能力。