Java:何时序列化未序列化的对象或将其置于瞬态?

Java:何时序列化未序列化的对象或将其置于瞬态?,java,serialization,Java,Serialization,在我的新工作中,非序列化字段和序列化对象中的对象让我感到困惑。 什么应该序列化,或者什么应该标记为暂时序列化 以下是一个例子: @Stateless public class NonSerializedThingStateless{ ... } @RequestScoped public class NonSerializedThingRequestScoped{ ... } @Named @SessionScoped public class SerializedBean impleme

在我的新工作中,非序列化字段和序列化对象中的对象让我感到困惑。
什么应该序列化,或者什么应该标记为暂时序列化

以下是一个例子:

@Stateless
public class NonSerializedThingStateless{
...
}

@RequestScoped
public class NonSerializedThingRequestScoped{
...
}


@Named
@SessionScoped
public class SerializedBean implements Serializable{
  @Inject
  private NonSerializedThingRequestScoped nstrs;

  @Inject
  private NonSerializedThingStateless nsts;

  private List<Something> list; //or something else like POJO

  ...
}
@无状态
公共类非序列化thingstateless{
...
}
@请求范围
公共类非序列化ThingRequestScope{
...
}
@命名
@会议范围
公共类SerializedBean实现了Serializable{
@注入
私有非串行化任务范围NSTR;
@注入
私有非串行化的非国有NST;
private List;//或类似于POJO的其他内容
...
}
有没有一种简单的好方法可以告诉我什么时候应该序列化注入的或使用过的类或指南


我真的必须在序列化和将事物置于瞬态之间做出选择吗?还是有其他方法?

首先,警告一句:您可能只想在简单的情况下使用
@Inject
(通常是单例)。除此之外,自动布线也可以工作,但很快就会变得混乱

这就是说,
transient
的规则很简单:当您读取对象(反序列化)时,您是否仍然拥有重建原始状态所需的所有内容


如果一个对象依赖于当前请求,那么答案可能是否定的:当从流中读取bean时,请求将消失很久。

首先,一句警告:您可能只想在简单的情况下(通常是单例)使用
@Inject
。除此之外,自动布线也可以工作,但很快就会变得混乱

这就是说,
transient
的规则很简单:当您读取对象(反序列化)时,您是否仍然拥有重建原始状态所需的所有内容


如果一个对象依赖于当前请求,那么答案可能是否定的:当从流中读取bean时,请求将消失很久。

首先,一句警告:您可能只想在简单的情况下(通常是单例)使用
@Inject
。除此之外,自动布线也可以工作,但很快就会变得混乱

这就是说,
transient
的规则很简单:当您读取对象(反序列化)时,您是否仍然拥有重建原始状态所需的所有内容


如果一个对象依赖于当前请求,那么答案可能是否定的:当从流中读取bean时,请求将消失很久。

首先,一句警告:您可能只想在简单的情况下(通常是单例)使用
@Inject
。除此之外,自动布线也可以工作,但很快就会变得混乱

这就是说,
transient
的规则很简单:当您读取对象(反序列化)时,您是否仍然拥有重建原始状态所需的所有内容


如果一个对象依赖于当前请求,那么答案可能是否定的:当从流中读取bean时,请求将消失很久。

在web应用程序中,会话范围的变量通常会声明为
实现可序列化的
。这有几个常见的原因:

  • 可以为会话复制配置群集环境(有多个应用程序服务器运行您的web应用程序)。在这种情况下,当用户会话发生更改(例如,我向购物车添加了一个项目)时,该更改将推送到集群中的所有其他应用程序服务器。这些应用服务器在不同的JVM中运行,需要一种将Java对象从一个JVM传递到另一个JVM的方法。为此,他们将会话序列化为字节流,并将字节写入套接字
  • 当单个应用服务器关闭时(可能是为了部署新的web应用版本),可以将其配置为保留会话,这意味着它通常会将会话写入磁盘。当它再次启动时,将从磁盘读取会话,并在运行的web应用程序中重新创建会话。同样,会话被序列化为
    字节[]
    ,并写入文件系统
  • 在决定字段是应序列化还是应暂时序列化时,请考虑以上两个示例。如果我们这样做,那么有几个简单的规则。一般来说:

  • 任何范围内的请求都应该是瞬态的。例如,用户在搜索字段中键入的搜索文本。此信息实际上不需要持久化,因为它只与当前请求相关
  • 任何无状态的东西都应该是瞬态的。这里的经典示例是记录器。记录器不需要序列化,因为没有应保存的状态。如果创建了新的记录器,代码将继续正常运行
  • 会话范围内的任何内容都应序列化。例如,用户首选项或添加到购物车的项目
  • 因此,要回答您的问题:

    有没有一种简单的好方法可以告诉我什么时候应该序列化注入的或使用过的类或指南

    考虑一下会话被序列化的原因(即我上面写的),并确定序列化是否有意义,而不管是否注入字段

    是真的我必须在序列化和将事情暂时化之间做出选择,还是有其他方法


    如果你肯定要连续化会话;然后是的,您必须选择什么应该序列化,什么应该是暂时的但是,如果您不是在群集环境中运行,则不会在关机时将会话保存到磁盘,并且没有其他问题;那么,完全有理由不让任何东西
    可序列化
    ,因为不会发生序列化

    在web应用程序中,会话范围的变量通常会