Java: Serializing String [] Массив для хранения в базе данных MySQL? - PullRequest
2 голосов
/ 04 октября 2009

Да, я знаю, что это плохая практика, и вместо этого я должен нормализовать свои таблицы. Кроме того, можно ли сериализовать массив String [] и сохранить его в базе данных?

Я из снисходительного и прощающего мира PHP, где вызывал функцию serialize () и преобразовывал массив в строку.

Есть ли в Java эквивалент такой ереси? Существуют ли более элегантные способы хранения строковых массивов в базе данных, кроме нормализации?

Если это применимо, я использую драйвер jdbc для своих подключений MySQL.

Ответы [ 6 ]

4 голосов
/ 04 октября 2009

Если вы думаете о необработанных массивах, вы все еще пишете PHP на Java.

Java - объектно-ориентированный язык. Массив Strings на самом деле не является большой абстракцией.

Здесь вы получите очень хороший совет, сообщающий, что можно сериализовать этот массив строк в BLOB, который вы можете легко сохранить в MySQL, и вы можете сказать себе, что снисходительность - это добродетель.

Но я напомню вам, что вы что-то теряете, не думая о предметах. Они действительно об абстракции и инкапсуляции и имеют дело с вещами на более высоком уровне, чем голые металлические вставки, строки и массивы.

Было бы неплохо попытаться спроектировать объект, который мог бы инкапсулировать массив или другую более сложную структуру данных дочерних объектов, которые были бы больше, чем Strings. Между родителем и ребенком должны быть отношения 1: m, которые лучше отражают проблему, которую вы действительно пытаетесь решить. Это был бы гораздо более объектно-ориентированный дизайн, чем тот, который вы предлагаете здесь.

4 голосов
/ 04 октября 2009

Да. Вы можете сериализовать любые объекты Java и сохранить сериализованные данные в MySQL.

Если вы используете обычную сериализацию (ObjectOutputStream), выходные данные всегда будут двоичными. Четная строка сериализуется в двоичные данные. Таким образом, вы должны Base64 кодировать поток или использовать двоичный столбец, такой как BLOB.

Это отличается от PHP, у которого serialize () преобразует все в текст.

Вы также можете использовать сериализацию XML в Java (XMLEncoder), но она очень многословна.

2 голосов
/ 04 октября 2009

Существуют различные хорошие библиотеки сериализации / десериализации, которые автоматически преобразуют объекты JavaBean в / из строк XML и JSON. У меня был хороший опыт: XStream .

Встроенная в Java поддержка сериализации может сделать то же самое, и вы можете написать собственные методы сериализации / десериализации для вызова Java.

Вы также можете свернуть свои собственные методы сериализации, например, преобразование в формат с разделением запятыми (CSV) и обратно.

Сначала я бы выбрал такую ​​библиотеку, как XStream, предполагая, что есть очень веская причина не нормализовать данные.

0 голосов
/ 04 октября 2009

Но, безусловно, более логичным было бы сохранить каждую строку как отдельную запись с подходящим идентификатором. Это, вероятно, было бы менее кодирующим, чем сериализация - простой цикл по элементам массива - и привело бы к чистому дизайну базы данных, а не к какой-то тупой путанице.

0 голосов
/ 04 октября 2009

Если вы действительно не хотите нормализовать эти значения в отдельную таблицу, где каждая строка будет находиться в отдельной строке, то просто преобразуйте ваш массив в список значений, разделенных запятыми (возможно, как-то через запятую). Может быть, каждая строка заключена в кавычки, так что "str1", "str2".

Google для CSV RFC для спецификации о том, как это должно быть правильно экранировано.

0 голосов
/ 04 октября 2009

Вы не хотите сериализовать массив. Я не уверен, почему вы также должны сериализовать его в PHP, потому что implode () и explode () были бы более подходящими. Вы действительно должны нормализовать свои данные, но помимо этого вы могли бы очень легко Google найти решение для преобразования массива в строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...