从InputStream转换对象 - Spring集成

时间:2017-04-14 15:52:24

标签: java tcp deserialization spring-integration tcpserver

由于客户端 - 服务器应用程序中的序列化,我试图通过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发送对象的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

SerializerDeserializer实现必须是线程安全的。实现这一目标的最简单方法是使实施无状态

由于您的班级中有这些属性,因此它们会在不同的调用之间共享。并且具有这样的状态会使行为变得不可预测。

ObjectInputStreamObjectOutputStream并非设计用于共享状态。

因此,您必须在调用ObjectInputStream时始终创建deserialize()

ObjectInputStream ois = new ObjectInputStream(inputStream);

等等。