2013-03-05 71 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