Spring服务应该是可序列化的

时间:2015-01-06 07:39:10

标签: java spring spring-mvc serialization

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

我收到NotSerializableException

服务器重启时会出现异常。我搜索解决方案,并了解会话范围bean应序列化。

我的会话范围bean实现了serializable,但它为注入的bean和服务提供了异常。

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

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

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

感谢。

2 个答案:

答案 0 :(得分:3)

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

编辑:创建类serializable意味着该类不能包含不可序列化的引用,或者必须将这些引用声明为transient

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

答案 1 :(得分:2)

正如马亨德拉已经指出的那样:

  

在反序列化对象时,瞬态字段将重置为默认值,因此您可能需要使用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作为价值对象和服务。