自制与 Java 序列化

2022-09-03 09:19:26

我有一个特定的POJO需要保存在数据库上,当前的设计将其字段指定为单个字符串列,并且向表中添加其他字段不是一个选项。

这意味着,对象需要以某种方式序列化。因此,只是为了基本实现,我去设计了自己的对象序列化形式,这意味着将所有字段连接到一个漂亮的字符串中,由我选择的分隔符分隔。但这相当丑陋,并且可能会导致问题,例如,如果其中一个字段包含我的分隔符。

所以我尝试了基本的Java序列化,但是从我进行的基本测试来看,这在某种程度上变成了一个非常昂贵的操作(构建ByteArrayOutputStream,ObjectOutputStream等,反序列化也是如此)。

那么我有哪些选择呢?序列化对象以进入数据库的首选方法是什么?

编辑:这将是我的项目中非常常见的操作,因此必须将开销保持在最低限度,并且性能至关重要。此外,第三方解决方案很好,但无关紧要(并且通常会产生我试图避免的开销)


答案 1

Elliot Rusty Harold写了一个很好的论据,反对对他的XOM库中的对象使用Java Object序列化。同样的原则也适用于您。内置的 Java 序列化是特定于 Java 的、脆弱且缓慢的,因此最好避免使用。

使用基于字符串的格式大致正确。正如您所说,问题在于您遇到了分隔符的格式/语法问题。解决方案是使用已经构建的格式来处理此问题。如果这是一种标准化格式,那么您也可以使用其他库/语言来操作它。此外,基于字符串的格式意味着您有希望通过观察数据来理解它;二进制格式删除该选项。

XML和JSON是这里的两个很好的选择;它们是标准化的,基于文本的,灵活的,可读的,并且具有大量的库支持。它们的性能也出奇地好(有时甚至比Java序列化更快)。


答案 2

你可以试试Propert Buffers,它是一个来自Google的开源项目,据说它很快(生成比XML更短的序列化形式,并且工作速度更快)。它还会轻柔地处理新字段的添加(插入默认值)。