마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드 <-> 서버 간 객체 직렬화 질문

0 추천

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가지를 제시하는 글을 읽어보았는데 어떤식으로 접근해야 하는게 보다 효율적일지 궁금하여 질문을 남깁니다.

 

,,, 고수님들의 적절한 관심과 답변을 기다리겠습니다.v

익명사용자 님이 2016년 3월 4일 질문

2개의 답변

+1 추천
개인적으로 소켓통신에 대한 깊은 지식이 있지 않기 때문에 제의견이 틀릴 수도 있습니다만

클래스를 직접 전달하고 꺼내는 방식 보다 서버와 클라이언트간 종속성을 없애기 위해  

REST 방식과 동일하게 json 이나 xml등의 형태로 데이터를 송수신 하는 편이

더 좋지 않을까 싶습니다. (최근에는 json 형태를 많이 선호하고 있습니다.)
Gradler (109,780 포인트) 님이 2016년 3월 4일 답변
0 추천
json이나 xml등을 이용하는것도 하나의 방법입니다.

좀더 퍼포먼스가 중요시 되는 프로젝트라면 프로토콜 버퍼나 플랫버퍼를 이용하시면 됩니다.

https://developers.google.com/protocol-buffers/

https://google.github.io/flatbuffers/
hater (6,600 포인트) 님이 2016년 3월 5일 답변
...