2013-03-27 3 views
2

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에서 캘린더 개체 중 하나를 사용할 수 있습니까? (그렇다면, 어떻게?) 내가 대신 사용해야하는 다른 객체가 있습니까?

+0

동일한 문제가 있습니다. 해결책을 찾았습니까? – matheuslf

+0

개체 직렬화 대신 JSON 사용이 끝났습니다. gson (http://code.google.com/p/google-gson/)을 사용하여 객체 직렬화를 사용하는 것처럼 쉽고 투명하게 추상화 할 수있었습니다. – FuryComputers

답변

3

I am attempting to use an object serialization socket connection between a Java server and an Android client

이는 제대로 작동하지 않을 수 있습니다.

I realize that it is not deserializing properly.

이는 잘 작동하지 않는 좋은 예입니다. Android는 이진 API 호환성을 유지 관리하기 위해 최선을 다하고 있습니다. 모든 클래스의 내부 구현은 수정 될 수 있습니다. 즉, Java 스타일 객체 직렬화가 수정 될 수 있습니다.

can I use one of the calendar objects on both Java and Android?

확실히. 서로 다른 플랫폼간에 Java 스타일의 객체 직렬화를 사용하지 마십시오.

값을 long (getTimeInMillis())으로 전달하거나 직접 작성한 JSON/XML/protobuf/serializer를 작성하십시오.

2

JavaSE 버전과 Android 버전 간에는 일대일 매핑이 없습니다. Android와 Java는 다르게 진화하고 있습니다. 이러한 SO 질문을 참조하십시오 :이 때문에

을, 나는 안드로이드에서 일한 사람이 아닌 일반 클래스의 serialVersionUID 변경 귀찮게했다 생각합니다. 직렬화 호환성은 하나의 JDK 버전에서 다른 버전으로 클래스를 전개 할 때 가장 현명한 문제 중 하나입니다. JavaSE와 Android 사이의 직렬화 호환성을 유지해야한다는 두려움을 상상해보십시오.

관련 문제