我正在尝试在 Java 服务器和 Android 客户端之间使用对象序列化套接字连接。尝试通过此连接发送日历对象时遇到问题。
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 客户端:(我创建了一个空白项目,并在清单中添加了 Internet 权限)
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 对象不同。但是,它们都共享相同的 serialVersionUID 1807547505821590642L。(这告诉我它们是为了通过序列化兼容)。
所以我想我正在寻找这里发生的事情的解释,我想知道,我可以在 Java 和 Android 上使用其中一个日历对象吗?(如果是这样,怎么做?)我应该使用不同的对象吗?