안드로이드 개발 질문/답변
(글 수 45,052)
java.lang.ClassNotFoundException: com.ClientNavis.MyinfoValues
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at java.io.ObjectInputStream.resolveClass(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at com.ServerNavis.serverTest.<init>(serverTest.java:29)
at com.ServerNavis.serverTest.main(serverTest.java:41)
클라이언트(안드로이드폰)와 서버(PC)간의 소켓 통신중에 발생한 에러 처리에 관해 질문을 남깁니다.
기본적인 소켓 사용과 객체 직렬화 정의에 관해선 숙지한 상태로 코드를 짰으며 (코드는 이상없이 돌아가기에 첨부하지 않았습니다.)
char,string,int,long등등 Primitive type 값을 통한 소켓 통신은 아무 문제 없이 잘 돌아갑니다.
ex)-------------- 성공시나리오 ---------------
<Client.java>
...
String c= "i'm client"; // int or double or long ...etc as Primitive type
oos.writeObject(c);
...
<Server.java>
...
String s; // int or double or long ...etc
s = ois.readObject();
...
그러나 임의의 객체 type을 이용하는 경우 ClassNotFoundException 와 같은 문제가 발생합니다.
ex)-------------- 실패시나리오 ----------------
<Member.java implements 직렬화>
id,pwd,name,number등등등 정의정의정의...set우짜구...get저쩌구...
<Client.java>
...
Member mb = new Member( ID, PWD, NAME.....)
oos.writeObject(mb);
...
<Server.java>
...
Member mb = (Member)ois.readObject();
...
여기까지의 테스트 수행을 통해 혹시, 안드로이드 내부의 소켓에서는 직렬화를 지원하지 않는것인지? 하는 의문이 들었으며,
이를 해결하기 위한 대책은 무엇이 있을까 라는 점이었습니다.
구글링을 통해 parcelable을 이용하는 방법, 혹은 service단에서 소켓을 열고 통신하는 방법,
이렇게 2가지를 제시하는 글을 읽어보았는데 어떤식으로 접근해야 하는게 보다 효율적일지 궁금하여 질문을 남깁니다.
,,, 고수님들의 적절한 관심과 답변을 기다리겠습니다.
2010.12.05 21:51:41
넵 물론입니다 서버와 클라이언트 양쪽 패키지상에 적재된 상태에서 일어나는 에러입니다. 기본형타입(int,string)을 전달할시에는 문제가 없으나, 사용자 정의형 객체타입을 전달하고자 할때 위와 같은 문제가 발생합니다. - 제 코드상의 현재 목적이 MyinfoValues 클래스를 객체화하고 이를 소켓통신을 통하여 서버 전송 및 DB에 저장하려고 하는것인데,, ㅠㅠ.. 그리고 무엇보다 답글을 달아주시는 분이 계셔서 감사하다는 마음을 전하고 싶네요!
2010.12.05 21:56:29
+ 추가로 검색을 통해 몇가지 정보를 찾은 바가 있는데 링크 하도록 하겠습니다.
- http://blog.naver.com/q1q3q5?Redirect=Log&logNo=10097632680 - 안드로이드 소켓 통신의 제한성에 관한 짧은 댓글...
- http://stackoverflow.com/questions/3964709/android-socket-objectoutputstream-not-working-correctly - 저와 똑같은 상황에 처한 외국 개발자의 질문과 답변...
+ 두 질문에 대한 답변이 상세하지 않고, 그 근거가 어디에 있는지를 명시하지 않아 마땅한 해결책을 찾지 못하였습니다.
위 내용이 정확한 얘기라면, 안드로이드 SDK 정책상의 문제라면, 어떤 식으로 해결하는 것이 합당한지 궁금합니다.
MyinfoValues 이 클래스를 찾지 못하겠다는 것인데요.
혹시 사용하는 쪽에 선언되어 있는지요?