Spring 服务应该是可序列化的

Spring services should be serializable

我正在开发 Spring-mvc 应用程序。

我得到 NotSerializableException

服务器重启时出现异常。我搜索解决方案并了解到会话作用域的 bean 应该被序列化。

我的会话作用域 bean 实现了可序列化,但它为注入的 bean 和服务提供了异常。

它要求我序列化所有注入的 bean 和服务。

我已经序列化了我的 bean,但是否也需要序列化服务。

序列化服务也是可以接受的行为吗? 如果是,那么我是否必须序列化我的应用程序中的所有服务?

谢谢。

Tomcat 会在您重新启动或关闭会话范围 bean 时序列化会话范围 bean,并在启动时恢复会话。您可以为要恢复的 bean 实施 serializable。否则跳过此错误。

编辑:制作 class serializable 意味着 class 不得包含不可序列化的引用,或者必须声明这些引用 transient.

反序列化对象时,transient 字段将重置为默认值,因此您可能需要使用 if( transientField == null) { .. }

重新初始化它

正如 Mahendra 已经指出的那样:

While deserializing the object, transient fields will reset to default value, so you might need to reinitialize it using if( transientField == null) { .. }

当您制作可序列化 bean 时,请确保您不想存储到磁盘的任何引用都标记为瞬态。这意味着在加载 bean 之后,您将重新设置被设置为 null 的 bean 成员。

例如:

private transient SomeService localServiceRef;
SomeService getSomeService() {
    if (localServiceRef == null) {
        localServiceRef = SomeService.getInstance();
    }
    return localServiceRef;
}

或者您可以将 id 存储在本地,并拥有一个临时解析的对象

private String objectId;
private transient SomeObject localObject;
SomeObject getLocalObject() {
    if (localObject == null) {
        localObject = SomeObjectFactory.getById(objectId);
    }
    return localObject;
}

虽然这当然取决于您的实际代码。

就我个人而言,我不喜欢使用实际上包含服务等的 bean。我更喜欢将 bean 作为值对象和服务,以便通过其他方式找到它们。