Java ObjectInputStream返回ObjectStreamClass
我有点麻烦。以下行在第一次读取时在客户端上执行良好,但在第二次读取时失败 java:72Java ObjectInputStream返回ObjectStreamClass,java,serialization,stream,network-programming,Java,Serialization,Stream,Network Programming,我有点麻烦。以下行在第一次读取时在客户端上执行良好,但在第二次读取时失败 java:72messagetask=(Message)in.readObject() 中是一个私有ObjectInputStream。收到的异常如下所示 Exception in thread "main" java.lang.ClassCastException: java.io.ObjectStreamClass cannot be cast to parallelprogramming.Message at
messagetask=(Message)in.readObject()代码>
中是一个私有ObjectInputStream。收到的异常如下所示
Exception in thread "main" java.lang.ClassCastException: java.io.ObjectStreamClass cannot be cast to parallelprogramming.Message
at parallelprogramming.WorkerNode.receiveTask(WorkerNode.java:72)
at parallelprogramming.WorkerNode.computeTillEndOfWork(WorkerNode.java:139)
at parallelprogramming.Worker.main(Worker.java:24)
Nov 15, 2014 11:07:15 PM parallelprogramming.WorkerNode receiveTask
SEVERE: null
java.io.StreamCorruptedException: invalid type code: 00
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1379)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at parallelprogramming.WorkerNode.receiveTask(WorkerNode.java:72)
at parallelprogramming.WorkerNode.lambda$startListeningForWork$0(WorkerNode.java:59)
at parallelprogramming.WorkerNode$$Lambda$1/798154996.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "WorkListener" java.lang.ClassCastException: parallelprogramming.MatMulTask cannot be cast to parallelprogramming.Message
at parallelprogramming.WorkerNode.receiveTask(WorkerNode.java:72)
at parallelprogramming.WorkerNode.lambda$startListeningForWork$0(WorkerNode.java:59)
at parallelprogramming.WorkerNode$$Lambda$1/798154996.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Java Result: 1
消息具有以下结构
public class Message implements IMessage{
private final MessageType type;
private final Object payload;
IMessage扩展了可序列化的功能。我在客户端和服务器端使用相同的ObjectInputStream和ObjectOutputStream。我试着四处寻找,但没有成功。还有人发现类似的东西吗
编辑2:
向工作者发送消息的代码:
private final Map<String, WorkerConn> nodes;
//nodes initialized in constructor
private void sendTaskToNode(ITask task, String node) {
if(task == null){
return;
}
try{
Message msg = new Message(MessageType.task, task);
nodes.get(node).sendObject(msg);
nodes.get(node).incrementworkCount();
System.out.println("Sent work to "+node);
} catch (IOException ex) {
Logger.getLogger(MasterNode.class.getName()).log(Level.SEVERE, null, ex);
}
}
接收有关Worker的消息的部分:
public void receiveTask() throws NotConnectedToMasterException {
try {
Message task = (Message) in.readObject();
if(task.getMessageType() == MessageType.task){
tasks.add((ITask) task.getPayload());
System.out.println("Received Task");
}else if(task.getMessageType() == MessageType.endOfWork){
ITask t = new AbstractTask() {
@Override
public Object call() throws Exception {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
};
t.setDeathPill();
tasks.add(t);
System.out.println("added deathpill");
}else{
System.out.println("Received "+task.getMessageType());
}
} catch(EOFException ex) {
return;
} catch (IOException ex) {
Logger.getLogger(WorkerNode.class.getName()).log(Level.SEVERE, null, ex);
return;
} catch (ClassNotFoundException ex) {
Logger.getLogger(WorkerNode.class.getName()).log(Level.SEVERE, null, ex);
}
}
编辑:
我发现了我的问题。我创建了一个线程来监听传入的任务,读取输入流,并且在任务队列为空时从主线程读取相同的输入流。在工作节点中:
private void startListeningForWork(){
workListener = new Thread(() -> {
while(!master.isClosed()){
try {
receiveTask();
} catch (NotConnectedToMasterException ex) {
break;
}
}
});
workListener.setName("WorkListener");
workListener.start();
}
private void startListeningForWork(){
workListener = new Thread(() -> {
while(!master.isClosed()){
try {
receiveTask();
} catch (NotConnectedToMasterException ex) {
break;
}
}
});
workListener.setName("WorkListener");
workListener.start();
}
及
这导致一个线程在另一个线程之前读取对象,并将事情搞砸。发现了我的问题。我创建了一个线程来监听传入的任务,读取输入流,并且在任务队列为空时从主线程读取相同的输入流。在工作节点中:
private void startListeningForWork(){
workListener = new Thread(() -> {
while(!master.isClosed()){
try {
receiveTask();
} catch (NotConnectedToMasterException ex) {
break;
}
}
});
workListener.setName("WorkListener");
workListener.start();
}
private void startListeningForWork(){
workListener = new Thread(() -> {
while(!master.isClosed()){
try {
receiveTask();
} catch (NotConnectedToMasterException ex) {
break;
}
}
});
workListener.setName("WorkListener");
workListener.start();
}
及
这导致其中一个线程在另一个线程之前读取对象,并将事情搞砸。显示您在哪里发送数据,以及将整个代码上载到github。我很抱歉,但我不会在所有这些文件中查找与特定的readObject
语句相关的writeObject
语句(特别是因为我在打电话)。至少告诉我哪一类在哪一个包裹里对那件事感到担忧。这里发送的消息没有详细说明,但我很确定您有一些同步问题。WorkerNode以线程不安全的方式使用节点映射。我没有完全分析worker,但我猜测您没有正确地同步对流的访问。正如@jtahlborn预测的那样。是的:)在我找到它之前调试了每一行:(java需要更好地解释这类东西的异常:p或更好地处理竞争
while(!task.isDeathPill()){
try {
results.addToResult(task.call());
sendACKtoMaster();
task = tasks.remove();
} catch (Exception ex) {
try {
receiveTask();
} catch (NotConnectedToMasterException ex1) {
Logger.getLogger(WorkerNode.class.getName()).log(Level.SEVERE, null, ex1);
break;
}
}
}