0

Groovyを使用して byte[] を Object に変換しようとしています。バイト配列で表される実際の G​​roovy クラスは、Serializable インターフェイスを実装し、別の Groovy クラス ファイルに格納されます。ClassNotFoundExceptionただし、関数を呼び出そうとすると、常にこのクラスの が取得されtoObjectます。私のコードは Java で書かれており、Java を使用している場合は機能しますが、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)
    }
4

1 に答える 1

1

私の推測では (これは @JustinPiper も同様に提案しています)、Groovy クラスを参照する前にコンパイルしていないということです。groovyc を使用して groovy クラスをコンパイルし、コンパイルされたクラス ファイルがクラスパス (おそらく Java テスト クラスと同じファイル) に配置されていることを確認する必要があります。

于 2012-08-29T17:30:55.963 に答える