不可序列化的会话 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的主要内容,如果未能解决你的问题,请参考以下文章

在 Websocket 会话中访问 UserAgent?

使用注入服务序列化域实例?

序列化 ASPX 页面?

Delphi字典保存/加载。 TDictionary不可序列化?

Spring websocket会话开始时间

java websocket 原生方式,代码编写