Java 尝试传递InputStream时StreamCorruptedException

Java 尝试传递InputStream时StreamCorruptedException,java,multithreading,sockets,serialization,Java,Multithreading,Sockets,Serialization,尝试将套接字InputStream变量传递给线程以写入对象时出错。我有客户端和两个线程:第一个读取文本输入,第二个读取序列化对象。它们同时运行,因此我设置了volatile静态输入流socketIs。是这样吗?如何修复它 java.io.StreamCorruptedException: invalid stream header: 57656C63 at java.io.ObjectInputStream.readStreamHeader(Unknown Source) at

尝试将套接字
InputStream
变量传递给线程以写入对象时出错。我有客户端和两个线程:第一个读取文本输入,第二个读取序列化对象。它们同时运行,因此我设置了volatile
静态输入流socketIs。是这样吗?如何修复它

java.io.StreamCorruptedException: invalid stream header: 57656C63
    at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
    at java.io.ObjectInputStream.<init>(Unknown Source)
    at com.client.ClientThreadInObj.<init>(ClientThreadInObj.java:25)
    at com.client.Client.main(Client.java:77)

服务器:

...
Timer timer = new Timer();
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        try {
                            FlattenLot fL = new FlattenLot(clientThread.m_clientSocket.getOutputStream(), currentLot);
                            fL.sendObj();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }, 100);
...
调试在服务器端显示错误,同时尝试
输出.writeObject(lot)
包装系列

import java.io.ObjectOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.*;

import com.server.Lot;

public class FlattenLot {

    OutputStream oStream;
    Lot lot;

    public FlattenLot(OutputStream os, Lot l){
        lot = l;
        oStream = os;
    }

    public void sendObj(){
        ObjectOutputStream out = null;
        try {
            out = new ObjectOutputStream(oStream);
            out.writeObject(lot); // ERROR: java.io.NotSerializableException
            out.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

}

地段:


批次实现可序列化的
。为什么抛出java.io.NotSerializableException

我已经从使用BufferReader(输入流)获取数据的第一个线程成功地获得了Lot对象。第二个线程无法读取对象,可能是因为它被第一个线程染成红色。似乎有两个线程在争夺套接字输入流,尽管
InputStream是=socket.getInputStream()
变量定义为volatile,并且必须确保线程安全协作

在套接字的生命周期中使用单个ObjectInputStream和ObjectOutputStream。

在套接字的生命周期中使用单个ObjectInputStream和ObjectOutputStream。

请重新格式化您的代码块,读起来非常困难。您的标题是StreamCorruptedException,堆栈跟踪也是如此。那个么你们为什么要谈论NotSerializableException呢?正如我所理解的,首先必须序列化对象,然后(通过服务器)将其写入流。之后,客户端可以获得StreamCorruptedException。@RCola您还没有回答我的问题。要么您得到了
NotSerializableException
,要么您没有,根据堆栈跟踪,您没有得到。那么你为什么要提到它呢?请重新格式化你的代码块,它非常难以阅读。你的标题是StreamCorruptedException,堆栈跟踪也是如此。那个么你们为什么要谈论NotSerializableException呢?正如我所理解的,首先必须序列化对象,然后(通过服务器)将其写入流。之后,客户端可以获得StreamCorruptedException。@RCola您还没有回答我的问题。要么您得到了
NotSerializableException
,要么您没有,根据堆栈跟踪,您没有得到。那你为什么提到它?嗨,你能帮我确认一下吗?对于客户端,在套接字的生命周期中有一个
ObjectInputStream
和一个
ObjectOutputStream
。对于服务器,为每个新套接字实现一个
ObjectInputStream
和一个
ObjectOutputStream
是否正确。接受连接?嗨,你能帮我确认一下吗?对于客户端,在套接字的生命周期中有一个
ObjectInputStream
和一个
ObjectOutputStream
。对于服务器,为每个新套接字实现一个
ObjectInputStream
和一个
ObjectOutputStream
是否正确?
import java.io.ObjectOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.*;

import com.server.Lot;

public class FlattenLot {

    OutputStream oStream;
    Lot lot;

    public FlattenLot(OutputStream os, Lot l){
        lot = l;
        oStream = os;
    }

    public void sendObj(){
        ObjectOutputStream out = null;
        try {
            out = new ObjectOutputStream(oStream);
            out.writeObject(lot); // ERROR: java.io.NotSerializableException
            out.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

}
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import java.util.Date;
import java.util.Calendar;

public class Lot implements Serializable{
    private static final long serialVersionUID = 1L;
    private  String NAME;
    public synchronized String getName(){return NAME;}
}