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 作为值对象和服务,以便通过其他方式找到它们。
我正在开发 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 作为值对象和服务,以便通过其他方式找到它们。