Простые свойства для преобразования строк в Java
Используя Java, мне нужно закодировать Map < String, String > пар значений значения для хранения в String и возможность декодировать его снова. Они будут храниться в столбце базы данных и, вероятно, обычно будут короткими и простыми, поэтому обычный случай должен создать простую симпатичную строку, но не должен искажать данные, даже если они содержат неожиданные символы и т.д.
Как бы вы решили сделать это так, чтобы:
- Закодированная форма - это единственная, понятная для человека строка.
- Для кодирования/декодирования не требуется большая библиотека или много контекста.
- Любые разметки должным образом экранированы
Url-кодирование? JSON? Сделай сам? Укажите любые вспомогательные библиотеки или методы, которые вы будете использовать.
(Отредактировано, чтобы указать больше контекста и требований по запросу.)
Ответы
Ответ 1
Как говорит @Uri, дополнительный контекст будет хорошим. Я думаю, что ваши основные проблемы меньше связаны с конкретной схемой кодирования, поскольку для большинства кодировок довольно просто сделать простой Map<String, String>
.
Интересный вопрос: для чего будет использоваться эта кодировка промежуточной строки?
-
если он чисто внутренний, ad-hoc формат хорош, например, простая конкатенация:
key1|value1|key2|value2
-
если люди ночью прочтут это, формат, подобный объявлению карты Ruby, хорош:
{ first_key => first_value,
second_key => second_value }
-
если кодировка заключается в отправке сериализованной карты по проводке в другое приложение, предложение XML имеет большой смысл, поскольку оно стандартно и разумно самодокументировано за счет многословности XML.
<map>
<entry key='foo' value='bar'/>
<entry key='this' value='that'/>
</map>
-
если карта будет сброшена в файл и снова прочитана другим Java-приложением, предложение @Cletus класс свойств является хорошим и имеет дополнительное преимущество: легко открывать и проверять людьми.
Изменить: вы добавили информацию, которую он должен хранить в столбце базы данных, - есть причина использовать один столбец, а не три столбца:
CREATE TABLE StringMaps
(
map_id NUMBER NOT NULL, -- ditch this if you only store one map...
key VARCHAR2 NOT NULL,
value VARCHAR2
);
Помимо хранения более семантически значимых данных, это более упрощает кодирование/декодирование на ваш уровень доступа к данным и позволяет другим читателям баз данных легко видеть данные без необходимости понимать какую-либо схему пользовательского кодирования, которую вы можете использовать. Вы также можете легко запросить ключ или значение, если хотите.
Изменить еще раз: вы сказали, что действительно нужно вписаться в один столбец, и в этом случае я либо:
-
используйте первую кодировку, разделенную по каналам (или любой другой экзотический символ, который вам нравится, может быть, какой-то unprintable-in-English символ юникода). Простейшая вещь, которая работает. Или...
-
если вы используете базу данных, такую как Oracle, которая распознает XML как реальный тип (и поэтому может дать вам оценки XPath против него и т.д.) и должна быть способна хорошо читать данные из уровня базы данных, пойдите с XML. Написание XML-парсеров для декодирования никогда не бывает забавным, но не должно быть слишком болезненным с такой простой схемой.
Даже если ваша база данных не поддерживает XML изначально, вы можете просто вставить ее в любой старый характерный тип столбцов...
Ответ 2
Почему бы просто не использовать класс свойств? Это делает именно то, что вы хотите.
Ответ 3
Я рассматриваю аналогичную потребность в выборе общего представления для разговоров (транспортный контент) между моими клиентами и серверами через шаблон фасада. Я хочу, чтобы стандартное стандартизованное представление, понятное для человека (краткое), надежное, быстрое. Я хочу, чтобы он был легким для реализации и запуска, простым в тестировании и простым "обертыванием". Обратите внимание, что я уже удалил XML по моему определению и с явным намерением.
Под "wrap" я подразумеваю, что я хочу поддерживать другие представления транспортного содержимого, такие как XML, SOAP, возможно, свойства Java или форматы Windows INI, значения разделенных запятыми (CSV) и т.д., буферы протокола Google, пользовательские двоичные файлы форматы, патентованные двоичные форматы, такие как книги Microsoft Excel, и все, что еще может прийти. Я бы использовал эти вторичные представления, используя обертки/декораторы вокруг основного фасада. Каждое из этих вторичных представлений желательно, особенно для интеграции с другими системами в определенных обстоятельствах, но ни одно из них не желательно в качестве первичного представления из-за различных недостатков (неспособность выполнить один или несколько из моих критериев, перечисленных выше).
Поэтому до сих пор я выбираю формат JSON в качестве своего основного представления транспортного содержимого. Я намерен подробно изучить этот вариант в ближайшем будущем.
Только в случае экстремальных соображений производительности я пропускаю перевод основного обычного формата. Преимущества чистого дизайна включают в себя хорошую производительность (без потерь усилий, простота обслуживания), для которых достойный выбор оборудования должен быть единственным необходимым дополнением. Когда потребности в производительности становятся экстремальными (например, обрабатывая сорок тысяч входящих файлов данных на общую сумму сорока миллионов транзакций в день), тогда ВСЕГДА следует пересмотреть в любом случае.
Как разработчик, администратор баз данных, архитектор и многое другое, я создал системы практически каждого размера и описания. Я уверен в своем выборе критериев и с нетерпением жду подтверждения его пригодности. В самом деле, я надеюсь опубликовать реализацию как open-source (но пока не задерживаю дыхание).
Обратите внимание, что это обсуждение дизайна игнорирует транспортный носитель (HTTP, SMTP, RMI,.Net Remoting и т.д.), который является намеренным. Я считаю, что гораздо эффективнее рассматривать транспортную среду и транспортный контент как совершенно разные соображения дизайна, друг от друга и от рассматриваемой системы. Действительно, я намерен сделать их практически "подключаемыми".
Поэтому я призываю вас серьезно рассмотреть JSON. С наилучшими пожеланиями.
Ответ 4
Некоторый дополнительный контекст для вопроса поможет.
Если вы собираетесь кодировать и декодировать всю гранулярность всей карты, почему бы просто не использовать XML?
Ответ 5
Как говорит @DanVinton, если вам это нужно во внутреннем использовании (я имею в виду "
внутреннее использование
как
он используется только моими компонентами, а не компонентами, написанными другими
вы можете указать ключ и значение.
Я предпочитаю использовать разный разделитель между ключом и ключом и ключом и значением:
Вместо
key1+SEPARATOR+value1+SEPARATOR+key2 etc
Я код
key1+SEPARATOR_KEY_AND_VALUE+value1+SEPARATOR_KEY(n)_AND_KEY(N+1)+key2 etc
если вы должны отлаживать, этот способ более ясен (по дизайну тоже)
Ответ 6
Проверьте конфигурационный пакет apache. Это позволит вам читать/сохранять файл как XML или формат свойств. Он также дает вам возможность автоматически сохранять изменения свойств в файл.
Настройка Apache
Ответ 7
А осознайте, что это старый "мертвый" поток, но у меня есть решение, не поставленное ранее, которое, как мне кажется, стоит выбросить на ринг.
Мы сохраняем "произвольные" атрибуты (т.е. созданные пользователем во время выполнения) географических функций в одном CLOB в БД в стандартном формате атрибутов XML. То есть:
name="value" name="value" name="value"
Чтобы создать элемент XML, вы просто "завершаете" атрибуты в элементе xml. То есть:
String xmlString += "<arbitraryAttributes" + arbitraryAttributesString + " />"
"Сериализация" экземпляра "Свойства" для строки xml-attributes - это не проблема... это похоже на десять строк кода. Нам повезло, что мы можем налагать на пользователей правило, что все имена атрибутов должны быть действительными именами xml-element; и мы xml-escape (т.е. "e; и т.д.) каждое "значение", чтобы избежать проблем с двойными кавычками и независимо от строк значений.
Это эффективный, гибкий, быстрый (достаточно) и простой.
Теперь, сказав все это... если бы у нас было время снова, мы просто полностью отделились бы от всей "проблемы метаданных", сохранив полный неподтвержденный неинтерпретированный XML-документ метаданных в CLOB и используя один из редакторы метаданных с открытым исходным кодом для обработки всего беспорядка.
Приветствия. Кит.