Java:序列化字符串 [] 数组以存储在 MySQL 数据库中?

Posted

技术标签:

【中文标题】Java:序列化字符串 [] 数组以存储在 MySQL 数据库中?【英文标题】:Java: Serializing String[] Array to store in a MySQL Database? 【发布时间】:2010-12-03 16:07:18 【问题描述】:

是的,我知道这是不好的做法,我应该规范化我的表格。抛开这个不谈,是否可以序列化一个String[]数组并存入数据库?

我来自 php 的宽容和宽容的世界,在那里调用 serialize() 函数并将数组转换为字符串。

在Java中是否有类似的异端行为? 除了规范化,还有没有更优雅的方式在数据库中存储字符串数组?

如果适用,我将使用 jdbc 驱动程序进行 mysql 连接。

【问题讨论】:

【参考方案1】:

是的。您可以序列化任何 Java 对象并将序列化后的数据存储到 MySQL 中。

如果您使用常规序列化 (ObjectOutputStream),则输出始终是二进制的。甚至 String 也被序列化为二进制数据。因此,您必须对流进行 Base64 编码或使用像 BLOB 这样的二进制列。

这与 PHP 不同,PHP 的 serialize() 将所有内容都转换为文本。

您也可以使用 Java 中的 XML 序列化(XMLEncoder),但它非常冗长。

【讨论】:

【参考方案2】:

如果您考虑的是原始数组,那么您仍在用 Java 编写 PHP。

Java 是一种面向对象的语言。字符串数组实际上并不是什么抽象。

您将在这里得到非常好的建议,告诉您可以将字符串数组序列化为一个 BLOB,您可以轻松地将其存储在 MySQL 中,并且您可以告诉自己宽大处理是一种美德。

但我会提醒你,如果你不考虑对象,你会失去一些东西。它们实际上是关于抽象和封装以及处理比裸机整数、字符串和数组更高级别的事物。

尝试设计一个可以封装数组或其他比字符串更复杂的子对象数据结构的对象是一个很好的练习。父母和孩子之间会有 1:m 的关系,这将更好地反映您真正想要解决的问题。这将是一种比您在这里提出的更面向对象的设计。

【讨论】:

【参考方案3】:

有各种优秀的序列化/反序列化库可以自动将 JavaBean 对象转换为 XML 和 JSON 字符串/从 XML 和 JSON 字符串转换。我有很好的经验是XStream。

Java 内置的对序列化的支持也可以做同样的事情,你可以编写自定义的序列化/反序列化方法供 Java 调用。

您也可以使用自己的序列化方法,例如转换为逗号分隔值 (CSV) 格式。

我会首先选择像 XStream 这样的库,假设有一个非常令人信服的理由不规范化数据。

【讨论】:

【参考方案4】:

您不想序列化数组。我也不确定你为什么要用 PHP 序列化它,因为 implode() 和 explode() 会更合适。您确实应该规范化您的数据,但除此之外,您还可以很容易地在 Google 上找到将数组转换为字符串的解决方案。

【讨论】:

【参考方案5】:

但当然更合乎逻辑的做法是将每个字符串保存为具有合适标识符的自己的记录。这可能会比序列化更少的编码——通过数组元素的简单循环——并且会产生一个干净的数据库设计,而不是一些粘糊糊的混乱。

【讨论】:

吉姆:感谢您对“它是”的更正!我经常被其他犯这种语法错误的人嘲笑——就像附近的一家杂货店在橱窗里挂着一个大牌子,“我们想成为你的食品店!” ——我又笑又笑。然后我自己做了!我必须羞愧地掩面。 :-( Jay:我就在你身边,喜欢嘲笑这些错误,但发现我也犯了! :-(【参考方案6】:

如果您真的不想将这些值规范化到一个单独的表中,其中每个字符串都在自己的行中,那么只需将您的数组转换为逗号分隔值的列表(可能以某种方式转义逗号)。也许引用每个字符串,以便 "str1","str2"。

Google for CSV RFC 了解如何正确转义。

【讨论】:

以上是关于Java:序列化字符串 [] 数组以存储在 MySQL 数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

Jedis存储Java对象(Java序列化为byte数组方式)

Java连载75-StringBuffer和StringBuilder

Leetcode题解——数据结构之哈希表

理解PHP数组的序列化和反序列化

redis怎么存数组和获取数组?

php序列化与反序列化