我正在开发一个应用程序,其中手机(Android程序)是尝试通过套接字将数据发送到计算机上的Java接收器程序的客户端。
到目前为止,我已经能够发送简单的字符串或其他任何内容,但现在我正在尝试发送我创建的自定义对象。我应该注意,这两个程序都是单独的Eclipse项目,我似乎在服务器端包含相同的自定义类“Order”时遇到问题(即使我在服务器项目的src文件夹中有Order.java)。
一些代码,供参考: 服务器:
private void run() throws Exception {
ServerSocket mySS = new ServerSocket(4443);
while(true) {
Socket SS_accept = mySS.accept();
InputStream is = SS_accept.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
Order order = (Order) ois.readObject();
if (order!=null){
java.util.List<String> items = order.getOrders();
int chair = order.getChair();
int table = order.getTable();
double price = order.getPrice();
System.out.println("Table: "+ table + " || Chair: " +chair);
for(String food: items) {
System.out.println(food);
}
System.out.println("Price: $"+price);
}
is.close();
SS_accept.close();
mySS.close();
}
客户的相关部分:
try {
mySocket = new Socket(serverService.ipAddress, serverService.port);
os = mySocket.getOutputStream();
oos = new ObjectOutputStream(os);
} catch(Exception e) {
Toast.makeText(PlaceOrder.this, "Error - not connected to server.", Toast.LENGTH_SHORT).show();
}
try {
oos.writeObject(order);
Toast.makeText(PlaceOrder.this, "Order Submitted!", Toast.LENGTH_SHORT).show();
refreshOrderPage(); //refresh page, allow waiter to make more orders
oos.close();
os.close();
mySocket.close();
} catch (Exception e) {
Toast.makeText(PlaceOrder.this, "Error - not connected to server.", Toast.LENGTH_SHORT).show();
}
我试图通过套接字发送对象时遇到此错误的任何想法?
感谢。
答案 0 :(得分:2)
您应该在类中设置serialVersionUID,然后使用共享类构建一个jar,并在两个项目中包含该jar。
但是,鉴于您使用的是不同的JVM(Oracle和Dalvik),因此无法保证字节级编码是相同的。您应该使用readObject
/ writeObject
手动覆盖序列化,或使用保证与环境无关的其他对象编码系统。
答案 1 :(得分:0)
堆栈跟踪会有所帮助,但几乎可以肯定,您在一侧序列化对象,将其发送到另一侧,而另一侧没有可用于重构对象的类定义。在这种情况下,听起来好像你的服务器不知道com.foo.Order类。
答案 2 :(得分:0)
您还可以将对象序列化为某种字符串格式(json,yaml,xml)并传递它。我想,维护起来要容易得多。