Java サーバーと Android クライアントの間でオブジェクトのシリアル化ソケット接続を使用しようとしています。この接続を介して Calendar オブジェクトを送信しようとしたときに問題が発生しました。
Calendar オブジェクトは Java サーバーによって送信され、Android クライアントによって受信されますが、LogCat に次のエラー メッセージが表示されます。
java.lang.NullPointerException: タイプ java.util.TimeZone のレシーバーが必要でしたが、null を取得しました
ちゃんとデシリアライズしていないことに気づきました。
エラーを再現するために、次のコード サンプルを用意しました。
Java サーバー:
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();
}
}
}
Android クライアント: (空のプロジェクトを作成し、マニフェストにインターネット アクセス許可を追加しました)
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 を共有しています。(これは、シリアル化によって互換性を保つことを意図していたことを示しています)。
だから私はここで何が起こっているのかの説明を探していると思います.JavaとAndroidの両方でカレンダーオブジェクトの1つを使用できますか? (そうであれば、どのように?) 代わりに使用すべき別のオブジェクトはありますか?