由于客户端 - 服务器应用程序中的序列化,我试图通过TCP发送对象。 TCP客户端是在android系统上编写的,我使用ObjectOutputStream来发送一个对象。使用spring集成编写TCP服务器,我尝试使用反序列化器读取此对象。像这样:
<int-ip:tcp-connection-factory id="hosServer"
serializer="connectionSerializeDeserialize"
deserializer="connectionSerializeDeserialize" ..... >
在实现Serializer和Deserializer接口的类中,我从InputSream创建ObjectInputStream,它是deserializer方法中的参数。它工作正常,我尝试再次连接到服务器的那一刻。然后我通过readObject()方法读取对象形式ObjectInputStream时收到EOFException。
public class CommandConverter implements Serializer<Command>, Deserializer<Command>{
private ObjectInputStream ois = null;
private ObjectOutputStream oos = null;
private CommandBuilder commandBuilder = new CommandBuilder();
public Command deserialize(InputStream inputStream) throws IOException {
if (ois == null)
ois = new ObjectInputStream(inputStream);
Command cmd = null;
try {
cmd = (Command) ois.readObject();
} catch (ClassNotFoundException e) {
commandBuilder.setCommandBuilder(new ImproperCommandBuilder());
commandBuilder.createCommand();
cmd = commandBuilder.getCommand();
} catch (InvalidClassException e) {
commandBuilder.setCommandBuilder(new ImproperCommandBuilder());
commandBuilder.createCommand();
cmd = commandBuilder.getCommand();
}
return cmd;
}
在Spring集成中通过TCP发送对象的最佳方法是什么?
答案 0 :(得分:0)
Serializer
和Deserializer
实现必须是线程安全的。实现这一目标的最简单方法是使实施无状态。
由于您的班级中有这些属性,因此它们会在不同的调用之间共享。并且具有这样的状态会使行为变得不可预测。
ObjectInputStream
和ObjectOutputStream
并非设计用于共享状态。
因此,您必须在调用ObjectInputStream
时始终创建deserialize()
:
ObjectInputStream ois = new ObjectInputStream(inputStream);
等等。