Java 서버와 Android 클라이언트간에 객체 직렬화 소켓 연결을 사용하려고합니다. 이 연결을 통해 Calendar 객체를 보내려고 할 때 문제가 발생했습니다.Android 캘린더 직렬화가 Java 6과 호환되지 않습니다.
달력 객체는 자바 서버에서 전송 및 안드로이드 클라이언트 받았지만, 나는 로그 캣에 오류 메시지가 표시됩니다 :
java.lang.NullPointerException: expected receiver of type java.util.TimeZone, but got null
내가 제대로 직렬화 복원되지 않는다는 것을 알고 있습니다.
나는 오류를 재현하는이 코드 샘플을 준비 :public class SerializeTest {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(49100);
Socket socket = serverSocket.accept();
OutputStream oStream = socket.getOutputStream();
ObjectOutputStream ooStream = new ObjectOutputStream(oStream);
String testString = "This is a test String";
Calendar testCalendar = Calendar.getInstance();
ooStream.writeObject(testCalendar);
ooStream.reset();
ooStream.close();
} catch(Exception e){
e.printStackTrace();
}
}
}
안드로이드 클라이언트
: (나는 빈 프로젝트를 생성하고 매니페스트에 인터넷 권한 추가)public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
Socket socket = new Socket("10.0.2.2", 49100);
InputStream iStream = socket.getInputStream();
ObjectInputStream oiStream = new ObjectInputStream(iStream);
Object object = oiStream.readObject();
Log.d("Test", object.toString());
oiStream.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
});
t.start();
}
}
를 자바 서버
해당 코드 샘플을 사용하여 Java 서버를 시작한 다음 Android 에뮬레이터에서 Android 클라이언트를 실행하면 오류가 발생합니다.
android-17/android.jar의 java.util.Calendar 객체가 jre6의 java.util.Calendar 객체와 다른 것을 확인했습니다. 그러나 그들은 둘 다 1807547505821590642L의 동일한 serialVersionUID를 공유합니다. (이는 직렬화를 통해 호환성이 있어야한다는 의미).
그래서 여기에서 무슨 일이 일어나고 있는지 설명하고 싶습니다. 자바와 Android에서 캘린더 개체 중 하나를 사용할 수 있습니까? (그렇다면, 어떻게?) 내가 대신 사용해야하는 다른 객체가 있습니까?
동일한 문제가 있습니다. 해결책을 찾았습니까? – matheuslf
개체 직렬화 대신 JSON 사용이 끝났습니다. gson (http://code.google.com/p/google-gson/)을 사용하여 객체 직렬화를 사용하는 것처럼 쉽고 투명하게 추상화 할 수있었습니다. – FuryComputers