当前位置: 首页 > 面试题库 >

哪种是Java序列化的最佳选择?

司徒修能
2023-03-14
问题内容

我目前正在一个项目中,该项目需要保留任何类型的对象(我们没有任何控制权的实现),以便以后可以恢复这些对象。

我们无法实现ORM,因为我们不能在开发时限制我们库的用户。

我们的第一个选择是使用Java默认序列化对其进行序列化,但是当用户开始传递同一对象的不同版本(属性更改的类型,名称等)时,恢复对象存在很多麻烦。

我们尝试使用XMLEncoder类(将对象转换为XML),但是发现缺少功能(例如,不支持Enums)。

最后,我们还尝试了JAXB,但这迫使我们的用户注释其类。

有什么好的选择吗?


问题答案:

对您来说,最简单的方法仍然是使用序列化(IMO),但是要对类的序列化形式进行更多的思考(无论如何,您还是应该这样做)。例如:

  1. 明确定义SerialUID。
  2. 在适当的地方定义自己的序列化表格。

序列化的形式是该类API的一部分,应仔细考虑其设计。

因为我所说的几乎所有内容都来自有效Java,所以我不会赘述。取而代之的是,请您参考它,特别是有关序列化的章节。它会警告您您遇到的所有问题,并提供相应的解决方案:

http://www.amazon.com/Effective-Java-2nd-Joshua-
Bloch/dp/0321356683

话虽如此,如果您仍在考虑非序列化方法,请注意以下几点:

XML编组

正如许多人指出的那样,这是一个选择,但我认为您仍然会遇到向后兼容的相同问题。但是,通过XML编组,您有望立即捕获这些错误,因为某些框架可能会在初始化期间为您做一些检查。

往返YAML

我一直在想这个主意,但是我真的很喜欢YAML格式(至少是自定义的toString()格式)。但实际上,对您而言唯一的区别是您将编组为YAML而不是XML。唯一的好处是,YAML比XML更具可读性。相同的限制适用。



 类似资料:
  • 问题内容: 我需要为某些对象实现JSON序列化,并且在与通用集合进行集成时遇到了一个问题。 所有可序列化的类都实现此接口(JSONObject来自此库): 我基于java.util.list的集合的代码大致如下所示: 我的问题是:当我从JSONObject加载AwesomeList时,我需要创建其元素,但是这是不可能的,因为Java禁止我写 我应该如何修改此任务的方法? 问题答案: 您是否绑定到该

  • 问题内容: 该图非常大,但无向。边缘未加权。 在我的实现中,我必须找到最大度数的顶点,并在顶点和边上都删除。 链表?数组列表?地图? 哪种对我的实施更好? 问题答案: 我的建议是将顶点存储在优先级队列中。这样,您可以非常快速地访问最高度的顶点。至于如何实现顶点,我将每个相邻的顶点存储在某种形式的数据结构中,例如HashSet或TreeSet,以便能够有效地删除内容。我不会明确地表示边缘,这不是必需

  • 问题内容: 编写了很多解析器。到目前为止,我一直使用HtmlUnit无头浏览器进行解析和浏览器自动化。 现在,我想将两个任务分开。 由于我80%的工作仅涉及解析,因此我想使用简单的HTML解析器,因为在HtmlUnit中花很多时间才能首先加载页面,然后获取源然后解析它。 我想知道哪个HTML解析器是最好的。如果解析器与HtmlUnit解析器接近,则解析器会更好。 编辑: 最好的情况是,我至少需要以

  • 问题内容: 我尚未遇到任何与序列化相关的问题。但是PMD和Findbugs发现了一系列关于序列化的潜在问题。典型的情况是注入的记录器被检测为不可序列化。但是还有更多- 还有几个CDI bean。 我还没有找到有关如何正确处理序列化的最佳实践。 反序列化注入的和注入的字段是否会被注入? 应该将它们标记为吗? 还是应该忽略/关闭代码检查? 我真的应该按照PMD的建议为所有这些字段提供访问者吗? 问题答

  • 问题内容: 我有一个说“销售”的对象列表。我只需要其产品与另一个列表(例如saleProductList)中的对象匹配的Sales对象。 除了循环以外,还有没有更好的方法可以做到这一点。 问题答案: 如果您已经在使用Google的Guava库,则它具有Collections2.filter()方法,该方法将仅返回集合中与给定Predicate匹配的项。 但是,这是否能回答您的问题取决于您避免循环的

  • 问题内容: 您将建议使用哪个Java SOAP XML对象序列化库与其他平台/语言(.NET,Delphi) 交换Java对象 ? 通信方案可能如下所示: Java对象编写器-> SOAP XML文本-> .NET或Delphi对象阅读器 .NET或Delphi对象编写器-> SOAP XML文本-> Java对象读取器 我知道有XStream XML序列化库和JSON作为替代解决方案,但是由于D