Java 从InputStream到Spring集成的对象转换
由于客户机-服务器应用程序中的序列化,我正在尝试通过TCP发送对象。TCP客户端是在android系统上编写的,我使用ObjectOutputStream发送一个对象。TCP服务器是用spring集成编写的,我尝试使用反序列化器读取这个对象。大概是这样的:Java 从InputStream到Spring集成的对象转换,java,tcp,deserialization,spring-integration,tcpserver,Java,Tcp,Deserialization,Spring Integration,Tcpserver,由于客户机-服务器应用程序中的序列化,我正在尝试通过TCP发送对象。TCP客户端是在android系统上编写的,我使用ObjectOutputStream发送一个对象。TCP服务器是用spring集成编写的,我尝试使用反序列化器读取这个对象。大概是这样的: <int-ip:tcp-connection-factory id="hosServer" serializer="connectionSerializeDeserialize" deserializer="connec
<int-ip:tcp-connection-factory id="hosServer"
serializer="connectionSerializeDeserialize"
deserializer="connectionSerializeDeserialize" ..... >
在实现序列化器和反序列化器接口的类中,我从InputSream创建ObjectInputStream,InputSream是反序列化器方法中的参数。在我再次尝试连接到服务器时,它工作正常。然后,在通过readObject()方法读取对象表单ObjectInputStream时,我接收到EOFEException
公共类CommandConverter实现序列化器、反序列化器{
私有ObjectInputStream ois=null;
私有ObjectOutputStream oos=null;
private CommandBuilder CommandBuilder=new CommandBuilder();
公共命令反序列化(InputStream InputStream)引发IOException{
如果(ois==null)
ois=新的ObjectInputStream(inputStream);
命令cmd=null;
试一试{
cmd=(命令)ois.readObject();
}catch(classnotfounde异常){
setCommandBuilder(新的ImproperCommandBuilder());
commandBuilder.createCommand();
cmd=commandBuilder.getCommand();
}捕获(InvalidClassException e){
setCommandBuilder(新的ImproperCommandBuilder());
commandBuilder.createCommand();
cmd=commandBuilder.getCommand();
}
返回cmd;
}
在spring integration中,通过TCP发送对象的最佳方法是什么?序列化器和反序列化器的实现必须是线程安全的。实现这一点的最简单方法是使实现无状态 因为你的类中有这些属性,它们在不同的调用之间共享。这种状态会使行为变得不可预测
ObjectInputStream
和ObjectOutputStream
不是为共享状态而设计的
因此,您必须在调用反序列化()
时始终创建ObjectInputStream
:
ObjectInputStream ois = new ObjectInputStream(inputStream);
等等
ObjectInputStream ois = new ObjectInputStream(inputStream);