Простые свойства для преобразования строк в Java - PullRequest
3 голосов
/ 16 декабря 2008

Используя Java, мне нужно кодировать Map пар имя-значение, чтобы сохранить их в String и иметь возможность декодировать их снова. Они будут храниться в столбце базы данных и, вероятно, будут, как правило, короткими и простыми, поэтому в общем случае должна получиться простая, красиво выглядящая строка, но она не должна портить данные, даже если они содержат неожиданные символы и т. Д.

Как бы вы решили сделать это так:

  • Зашифрованная форма представляет собой одну читаемую человеком строку
  • Для кодирования / декодирования не требуется большая библиотека или большой контекст
  • Любые разделители должным образом экранированы

URL-кодировка? JSON? Сделай это сам? Пожалуйста, укажите любые вспомогательные библиотеки или методы, которые вы будете использовать.

(отредактировано для уточнения контекста и требований в соответствии с запросом.)

Ответы [ 7 ]

5 голосов
/ 16 декабря 2008

Как говорит @Uri, дополнительный контекст был бы хорош. Я думаю, что ваши основные проблемы меньше связаны с конкретной схемой кодирования, так как переход на собственную для большинства кодировок довольно прост для простого Map<String, String>.

Интересный вопрос: для чего будет использоваться эта промежуточная строковая кодировка?

  • если он чисто внутренний, то подойдет специальный формат, например, простая конкатенация:

    key1|value1|key2|value2
    
  • если люди читают его ночью, формат, подобный объявлению карты Руби, хорош:

    { first_key  => first_value, 
      second_key => second_value }
    
  • если кодировка предназначена для отправки сериализованной карты по проводам в другое приложение, предложение XML имеет большой смысл, поскольку оно стандартно и достаточно самодокументировано, за счет многословия XML.

    <map>
        <entry key='foo' value='bar'/>
        <entry key='this' value='that'/>
    </map>
    
  • если карта будет сброшена в файл и позже прочитана другим Java-приложением, предложение @Cletus класса Properties является хорошим и имеет дополнительное преимущество: быть легко открываемым и проверяемым людьми.


Редактировать: Вы добавили информацию, которая должна храниться в столбце базы данных - есть ли причина использовать один столбец, а не три столбца, например:

CREATE TABLE StringMaps 
(
    map_id NUMBER   NOT NULL,  -- ditch this if you only store one map...
    key    VARCHAR2 NOT NULL,
    value  VARCHAR2
);

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


Отредактируйте еще раз: вы сказали, что он действительно должен помещаться в один столбец, в этом случае я бы либо:

  • используйте первую кодировку, разделенную конвейером (или любой другой экзотический символ, который вам нравится, возможно, какой-нибудь непечатный в английском символе юникода). Самое простое, что работает. Или ...

  • если вы используете базу данных, такую ​​как Oracle, которая распознает XML как реальный тип (и, следовательно, может дать вам оценки XPath по нему и т. Д.) И должна уметь хорошо читать данные из уровня базы данных иди с XML. Написание XML-парсеров для декодирования никогда не бывает увлекательным, но не стоит слишком мучаться с такой простой схемой.

Даже если ваша база данных не поддерживает XML изначально, вы можете просто выбросить ее в любой старый символьно-подобный тип столбца ...

3 голосов
/ 16 декабря 2008

Почему бы просто не использовать класс Properties ? Это именно то, что вы хотите.

1 голос
/ 16 декабря 2008

Я размышлял над аналогичной необходимостью выбора общего представления для разговоров (транспортного контента) между моими клиентами и серверами через шаблон фасада. Я хочу, чтобы представление было стандартизированным, читабельным (кратким), надежным, быстрым. Я хочу, чтобы он был легким в реализации и запуске, простым в тестировании и простым в переноске. Обратите внимание, что я уже удалил XML по своему определению и с явным намерением.

Под "переносом" я подразумеваю, что я хочу поддерживать другие представления транспортного контента, такие как XML, SOAP, возможно, свойства Java или форматы Windows INI, значения через запятую (CSV) и т. форматы, патентованные двоичные форматы, такие как книги Microsoft Excel, и все остальное, что может прийти. Я реализовал бы эти вторичные представления, используя обертки / декораторы вокруг основного фасада. Каждое из этих вторичных представлений желательно, особенно для интеграции с другими системами при определенных обстоятельствах, но ни одно из них не является желательным в качестве основного представления из-за различных недостатков (неспособность соответствовать одному или нескольким моим критериям, перечисленным выше).

Поэтому до сих пор я выбираю формат JSON в качестве основного представления транспортного контента. Я намерен подробно изучить этот вариант в ближайшем будущем.

Только в случаях экстремальных соображений производительности я мог бы пропустить перевод основного традиционного формата. Преимущества чистого дизайна включают в себя хорошую производительность (без лишних усилий, простоту обслуживания), для которой достойный выбор оборудования должен быть единственным необходимым дополнением. Когда производительность становится чрезвычайно высокой (например, обработка сорока тысяч входящих файлов данных на общую сумму сорок миллионов транзакций в день), тогда ВСЕ нужно пересматривать в любом случае.

Как разработчик, администратор баз данных, архитектор и многие другие, я создал системы практически любого размера и описания. Я уверен в своем выборе критериев и с нетерпением жду подтверждения его пригодности. В самом деле, я надеюсь опубликовать реализацию как open-source (но пока не затаив дыхание).

Обратите внимание, что в этом обсуждении проекта игнорируется транспортная среда (HTTP, SMTP, RMI, .Net Remoting и т. Д.), Которая является преднамеренной. Я считаю, что гораздо эффективнее рассматривать транспортную среду и транспортный контент как совершенно отдельные конструктивные соображения друг от друга и от рассматриваемой системы. На самом деле, я намерен сделать их практически «подключаемыми».

Поэтому я призываю вас строго рассмотреть JSON. С наилучшими пожеланиями.

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

Я понимаю, что это старая "мертвая" нить, но у меня есть решение, которое не было предложено ранее, которое, я думаю, стоит бросить на ринге.

Мы храним «произвольные» атрибуты (т. Е. Созданные пользователем во время выполнения) географических функций в одном столбце CLOB в БД в стандартном формате атрибутов XML. То есть:

name="value" name="value" name="value"

Чтобы создать элемент XML, вы просто «оборачиваете» атрибуты в элементе xml. То есть:

String xmlString += "<arbitraryAttributes" + arbitraryAttributesString + " />"

"Сериализация" экземпляра Properties в строку атрибутов xml - это просто ... это похоже на десять строк кода. Нам повезло, что мы можем навязать пользователям правило, что все имена атрибутов должны быть действительными xml-element-names; и мы xml-escape (т. е. & quote; и т. д.) каждое «значение», чтобы избежать проблем в двойных кавычках и прочем в строках значений.

Это эффективно, гибко, быстро (достаточно) и просто .

Теперь, сказав все это ... если бы у нас было время снова, мы бы просто полностью оторвались от всей "проблемы метаданных", сохранив полный неискаженный неинтерпретированный XML-документ метаданных в CLOB и использовать один из редакторов метаданных с открытым исходным кодом для обработки всего беспорядка.

Приветствия. Кит.

0 голосов
/ 23 декабря 2008

Проверьте пакет конфигурации Apache Commons. Это позволит вам прочитать / сохранить файл в формате XML или свойства. Это также дает вам возможность автоматически сохранять изменения свойств в файл.

Конфигурация Apache

0 голосов
/ 16 декабря 2008

Как говорит @DanVinton, если вам нужно это для внутреннего использования (я имею в виду "

внутреннее использование

как

он используется только моими компонентами, а не компонентами, написанными другими

Вы можете указать ключ и значение. Я предпочитаю использовать разные разделители между ключом и ключом и ключом и значением:
Вместо
key1+SEPARATOR+value1+SEPARATOR+key2 etc
Я код
key1+SEPARATOR_KEY_AND_VALUE+value1+SEPARATOR_KEY(n)_AND_KEY(N+1)+key2 etc

если вам нужно отладить, этот способ более понятен (тоже по замыслу)

0 голосов
/ 16 декабря 2008

Какой-то дополнительный контекст для вопроса поможет.

Если вы собираетесь кодировать и декодировать со всей детализацией карты, почему бы просто не использовать XML?

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