2012-08-28 54 views
0

我正在嘗試使用Groovy將字節[]轉換爲對象。我用字節數組表示的實際Groovy類實現了Serializable接口,並存儲在一個單獨的Groovy類文件中。然而,當我嘗試打電話給我的toObject函數時,我總是得到這個類的ClassNotFoundException。我的代碼是用Java編寫的,在使用Java時可用,但在使用Groovy時不可用。如何在Groovy中將字節[]轉換爲對象,反之亦然

private static byte[] toByteArray(Object obj) { 
    byte[] bytes = null; 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    try { 
     ObjectOutputStream oos = new ObjectOutputStream(bos); 
     oos.writeObject(obj); 
     oos.flush(); 
     oos.close(); 
     bos.close(); 
     bytes = bos.toByteArray(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    return bytes; 
} 


private static Object toObject(byte[] bytes) { 
    Object obj = null; 
    try { 
     ByteArrayInputStream bis = new ByteArrayInputStream(bytes); 
     ObjectInputStream ois = new ObjectInputStream(bis); 
     obj = ois.readObject(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); // ClassNotFoundException 
    } 
    return obj; 
} 

這樣做的最好方法是什麼?

編輯:一,將在這方面會在哪裏發生ClassNotFoundException的使用類是這樣的:

public class MyItem implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = -615551050422222952L; 

public String text 


MyItem() { 
    this.text = "" 
} 
} 

然後測試整個事情:

void test() { 
     MyItem item1 = new MyItem() 
     item1.text = "bla" 

     byte[] bytes = toByteArray(item1) // works 

     Object o = toObject(bytes) // ClassNotFoundException: MyItem 

     MyItem item2 = (MyItem) o 

     System.out.print(item.text + " <--> " + item2.text) 
    } 
+0

只是爲了澄清,當你說它存儲在一個單獨的Groovy類文件中時,你的意思是一個由groovyc編譯的實際.class文件,還是一個單獨的.groovy文件?你的例子是爲我寫的,但是隻有在我編譯定義Serializable類的源文件的時候。 –

+0

這對我來說有點困惑。 ClassNotFoundException的目標是什麼類?這個班是編譯的嗎?它在類路徑上嗎? –

+0

@JustinPiper在單獨的.groovy文件中 – IHeartAndroid

回答

1

我的猜測(這@JustinPiper也是這樣建議的)是,在引用它之前,你並沒有編譯你的groovy類。您必須使用groovyc編譯您的groovy類,並確保編譯後的類文件放置在類路徑中(可能與java測試類位於同一文件中)。

+0

由於某種原因,我不再有問題了。我沒有改變任何與這些類相關的東西,但現在它運行時沒有例外....我使用IntelliJ,所以我認爲在執行重建時將編譯該類。不過,我只能猜測我的問題與此有關。因此,對於任何有相同問題的人,在構建和開始剩下的部分之前,分別編譯.groovy類。在IntelliJ中,只需右鍵單擊該文件,然後按「編譯'MyItem.groovy'」 – IHeartAndroid

+0

在Eclipse中,如果groovy文件位於源文件夾中,它將自動編譯。沒有辦法從項目的其餘部分分別編譯groovy文件。 –

+0

因爲我不知道爲什麼,並且單獨的編譯也不起作用,所以我運行了grails命令'clean'和'clean-proxy',重建了整個項目,現在又重新運行了。 – IHeartAndroid

相關問題