不可序列化的会话 websocket java ee
Posted
技术标签:
【中文标题】不可序列化的会话 websocket java ee【英文标题】:non serializable session websocket java ee 【发布时间】:2015-02-09 17:40:49 【问题描述】:我写了一个 ExchangeMoney 类实现 Serializable 接口。此类具有 Session (javax.websocket.Session) 属性。见以下代码:
import javax.websocket.Session;
import javax.websocket.EncodeException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.io.Serializable;
...
public class ExchangeMoney implements Serializable
private static final long serialVersionUID = -4363184570862565571L;
private static final Logger logger = Logger.getLogger("ExchangeMoney ");
private Session session;
....
由于会话字段不可序列化而导致的错误。如何解决这个问题。
【问题讨论】:
当 ExchangeMoney 对象被序列化时,Session 真的需要保持打开状态吗?我倾向于使 Session 字段瞬态,并将连接所需的信息(URI 和端点类名称)保留在同一类的可序列化字段中,以便在反序列化后重新打开 Session。 是的,当 ExchangeMoney 对象被序列化时,Session 确实需要保持打开状态。这种情况有什么解决方案?我想保持这个 Session 与 Client Endpoint 通信。如果将 Session 字段设置为瞬态,然后在反序列化后重新打开,则会创建新的 Endpoint 和新的 Session。 这是解决方案。有关详细信息,请参阅此链接***.com/questions/27037570/… 不幸的是,您提到的解决方案是针对单节点的。我处于通过网络套接字连接客户端的类似情况。服务器从队列中接收数据,这些数据需要通过 web-socket 发送给客户端。这一切都适用于单个节点,但不适用于多个节点(没有集群),因为 WebSocket 会话不可序列化,因此 delima :(。感谢您的帮助。 【参考方案1】:查看这篇文章。 Java Serialization with non serializable parts
基本上,您可以扩展会话并实现可序列化并覆盖 writeObject 和 readObject 方法,并尝试持久化和读取您感兴趣的值。
【讨论】:
【参考方案2】:重新考虑设计。为什么一个可序列化的对象需要一个 websocket 会话,如果需要,它不应该是瞬态的吗?
【讨论】:
不应使会话瞬态。这种情况有什么解决方案?我想保持这个会话与客户端端点通信。以上是关于不可序列化的会话 websocket java ee的主要内容,如果未能解决你的问题,请参考以下文章