我正在开发Spring-mvc应用程序。
我收到NotSerializableException
。
服务器重启时会出现异常。我搜索解决方案,并了解会话范围bean应序列化。
我的会话范围bean实现了serializable,但它为注入的bean和服务提供了异常。
它要求我序列化所有注入的bean和服务。
我已经序列化了我的bean,但它也需要序列化服务。
是否也接受了序列化服务的行为? 如果是,那么我是否必须序列化我的应用程序中的所有服务?
感谢。
答案 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作为价值对象和服务。