2012-08-28 5 views
0

Groovy을 사용하여 byte []를 Object로 변환하려고합니다. 바이트 배열로 표현되는 실제 Groovy 클래스는 Serializable 인터페이스를 구현하며 별도의 Groovy 클래스 파일에 저장됩니다. 그러나 내 toObject 함수를 호출하려고 할 때 항상이 클래스의 ClassNotFoundException을 얻습니다. 내 코드는 Java로 작성되었으며 Java를 사용할 때는 작동하지만 Groovy를 사용할 때는 작동하지 않습니다.Groovy에서 byte []를 Object로 또는 그 반대로 변환하는 방법

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; 
} 

이렇게하는 가장 좋은 방법은 무엇입니까?

편집 :

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 또는 다른 .groovy 파일로 컴파일 된 실제 .class 파일을 의미합니까? 귀하의 예제는 나를 위해 작성된 것처럼 작동하지만, Serializable 클래스를 정의하는 소스 파일을 컴파일하는 경우에만 해당됩니다. –

+0

이것은 다소 혼란 스럽습니다. ClassNotFoundException의 타겟은 어떤 클래스입니까? 그 수업은 컴파일 된거야? 그것은 classpath에 있습니까? –

+0

@JustinPiper 별도의 .growovy 파일 – IHeartAndroid

답변

1

내 생각을 (그리고 이것을의 ClassNotFoundException이 발생한다 이러한 맥락에서 사용되는 클래스는이 같은 것입니다 @JustinPiper가 제안한 것)은 참조하기 전에 Groovy 클래스를 컴파일하지 않는다는 것입니다. Groovy를 사용하여 Groovy 클래스를 컴파일하고 컴파일 된 클래스 파일이 클래스 경로 (Java 테스트 클래스와 동일한 파일에 있음)에 배치되어 있는지 확인해야합니다.

+0

어떤 이유로 더 이상 문제가 없습니다. 나는 그 클래스들과 관련이있을 것이지만 지금은 예외없이 실행되는 것을 바꾸지 않았다 ... 나는 IntelliJ를 사용하므로 클래스 컴파일은 Rebuild를 수행 할 때 돌봐 줄 것이라고 생각했다. 그러나 나는 그 문제가 내 문제와 관련이 있다고 추측 할 수 있습니다. 따라서 같은 문제가있는 사람이라면 나머지 부분을 빌드하고 시작하기 전에 .groovy 클래스를 별도로 컴파일하십시오. IntelliJ에서 파일을 마우스 오른쪽 버튼으로 클릭하고 "Compile 'MyItem.groovy" " – IHeartAndroid

+0

Eclipse에서 그루비 파일은 소스 폴더에 있으면 자동으로 컴파일됩니다. Groovy 파일을 나머지 프로젝트와 별도로 컴파일 할 수있는 방법은 없습니다. –

+0

이유를 모른 채 문제가 다시 발생했기 때문에 별도의 컴파일이 작동하지 않았기 때문에 grails 명령 인'clean'과'clean-proxy'를 실행하여 전체 프로젝트를 다시 빌드했다가 다시 작동합니다. – IHeartAndroid

관련 문제