当前位置: 首页 > 知识库问答 >
问题:

Java中的任何服务器、框架或J2EE本身是否仍在使用序列化?

惠洛华
2023-03-14

“Serializable”类中有一个称为字段的声纳规则应该是瞬态的或可序列化的。当您向类中添加一个不可序列化的字段时,会出现此问题。该规则规定:

例如,在负载情况下,大多数J2EE应用程序框架都会将对象刷新到磁盘,而据称具有非瞬态、非序列化数据成员的可序列化对象可能会导致程序崩溃,并为攻击者打开大门。

这对我来说似乎过时了。在有效的Java第三版中,当开发新软件时,序列化是不相关的。此外,从Java中删除序列化是Oracle的“长期目标”。爪哇首席建筑师马克·莱因霍尔德表示

这里已经提出了一个问题,Spring框架是否可以刷新对象:

  • Spring是否将对象刷新到负载下的磁盘?

因此,我提出了一个问题:是否有任何现代应用服务器、框架或J2EE实现本身(尤其是与CDI、EJB、JPA交互的Java组件)在重载情况下将对象刷新到磁盘?

还是这种说法已经过时了?

共有1个答案

李光华
2023-03-14

TL;博士

如果您没有实现一个可分发的web应用程序,您没有启用会话持久性,并且您只使用内存缓存,那么您可能不需要在任何地方进行序列化。

解释

对于会话复制,Java序列化仍然是最新Servlet规范的必要条件:https://jakarta.ee/specifications/servlet/5.0/jakarta-servlet-spec-5.0.html#distributed-environments

一个常见的用法是,如果您在一个负载均衡器后面有多个服务器,并且您在一个服务器上登录,您会得到一个JSESSIONID cookie。如果负载均衡器将您发送到另一个服务器进行下一个请求,您的登录属性和其他会话范围的属性将在新服务器上序列化和复制,因此您的JSESSIONID在那里仍然有效。

另一个需要对会话范围属性进行序列化的用例是应用程序服务器决定将会话交换到磁盘。例如,对于Tomcat 8,可以将其配置为在内存中保留的会话太多时激活,或者在服务器重新启动时激活,并且您希望保持会话处于活动状态。看见https://tomcat.apache.org/tomcat-9.0-doc/config/manager.html

默认情况下,每个与Servlet-5.0兼容的应用程序服务器都必须支持Http会话中的Serializable对象,用于这些类型的用户名。

对于某些服务器,这可以通过使用Jackson JSON序列化或类似的方式进行调整或覆盖。参见例如,如何在spring中使用jackson而不是JdkSerializationRedisSerializer

另一个常见的用例是缓存。这用于尽可能快地访问对象,最好是在内存中,但可能会暂时卸载到磁盘或外部缓存服务器。有一个标准的API(JSR-107)明确选择不需要可序列化对象,但大多数实现仍然默认使用java序列化作为卸载部分。

您可以再次调整这些机制以支持其他序列化机制,例如,对于ehcache:https://www.ehcache.org/documentation/3.8/serializers-copiers.html

 类似资料:
  • 如果有人能给我提供一个简单的POST/GET示例,使用一个合适的POJO对象模型,那就太好了。 我有限的理解是,OData将关于实际对象模型的任何信息从编译时移动到客户端的运行时。我很乐意忽略这一点,并针对固定对象模型编写代码,因为我们使用的服务不会改变。

  • 问题内容: Java中是否有CRUD生成器实用程序,例如Rails中的Scaffolding?可以在任何框架中,甚至可以在普通servlet中。必须在jsp中生成控制器+视图,而不仅仅是DAO代码… 问题答案: Spring Roo 似乎正是您要寻找的东西:CRUD代码生成,吐出纯Java代码,可以使它们完全独立于框架运行。

  • 我被要求对Glassfish 3.0上托管的Java应用程序进行更改。我没有源代码。我是否能够通过反编译获得源代码,对其进行更改,并使用更改重新部署它?有人能帮忙吗?

  • 问题内容: 我正在计划制作Java Swing应用程序,并且想知道是否仍在使用Swing或是否已将其替换为其他东西。 提前致谢! 问题答案: 我们仍然使用它。并非所有的东西都是Web应用程序,到目前为止,已经进行了一些尝试性的替换(例如,将Eclipse写入到 SWT 中)。SWT拥有一个本机层,将基础调用包装到本机窗口层。它仅适用于有限的平台集,并且当然需要一些第三方共享库。我敢说,SWT应用程

  • 针对 J2EE 体系,Hibernate 有如下几个集成的方面: 容器管理的数据源(Container-managed datasources): Hibernate 能使用通过容器管理,并由 JNDI 提供的 JDBC 连接。通常,特别是当处理多个数据源的分布式事务的时候,由一个 JTA 兼容的 TransactionManager 和一个 ResourceManager 来处理事务管理(CMT

  • 问题内容: 我已经开始用PHP编写一些应用程序,并且我对该语言也越来越熟悉。有人告诉我有关CakePHP和CodeIgniter的信息。我想更好地了解这些方法如何为我提供帮助,以及是否值得花时间学习框架? 问题答案: 使用MVC PHP框架有什么好处? 好了,使用PHP框架有很多好处,让我们看看使用它们的一些主要好处。 这些PHP框架遵循某些设计模式,因此,当您使用框架时,必须遵循其编码约定,这可