Самодельный по сравнению с сериализацией Java

Хорошо, мне удалось придумать метод обхода, подобный этому:

  1. Я заменил каждую новую строку двойными трубами: ||
  2. Когда Я загружаю содержимое переменных окружения через функцию люмена env(), я заменяю его обратно на новые строки

, например, мой .env

SFTP_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----||HkVN9…||-----END DSA PRIVATE KEY-----||"

и вот как вы его используете:

$privateKey = env('SFTP_PRIVATE_KEY');
$privateKey = str_replace('||', PHP_EOL, $privateKey);

// Debug
echo '<pre>';
echo($privateKey);
exit;

Я проверил это, и теперь это работает, дайте мне знать, если есть лучший способ.

15
задан Yuval Adam 28 October 2008 в 19:29
поделиться

14 ответов

Elliot Rusty Harold описал хороший аргумент против использования Сериализации объекта Java для объектов в его библиотеке XOM. Те же принципы относятся к Вам. Встроенная сериализация Java является определенной для Java, хрупкой, и медленной, и лучшая избегаемый - также.

У Вас есть примерно верная мысль в использовании Основанного на операция со строками формата. Проблема, как Вы заявляете, состоит в том, что Вы сталкиваетесь с проблемами форматирования/синтаксиса с разделителями. Решение состоит в том, чтобы использовать формат, который уже создается для обработки этого. Если это - стандартизированный формат, то можно также потенциально использовать другие библиотеки/языки для управления им. Кроме того, основанный на операция со строками формат означает, что у Вас есть надежда на понимание его только визуальным контролем данные; двоичные форматы удаляют ту опцию.

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

12
ответ дан 1 December 2019 в 01:00
поделиться

Вы изучили JAXB? Это - механизм, которым можно определить комплект объектов Java, которые создаются из XML-схемы. Это позволяет Вам упорядочивать от иерархии объектов до XML или не упорядочивать XML назад в иерархию объектов.

0
ответ дан 1 December 2019 в 01:00
поделиться

Я буду второе предложение для использования JAXB, или возможно XStream (прежний быстрее, последний имеет больше внимания на часть сериализации объекта). Плюс, я далее предложу достойную основанную на JSON альтернативу, Jackson (http://jackson.codehaus.org/Tutorial), который может полностью бобы сериализатора/десериализовывать к тексту JSON для хранения в столбце.

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

0
ответ дан 1 December 2019 в 01:00
поделиться

Рассмотрите изменение Вашей схемы. Даже если Вы находите быстрый способ сериализировать POJO к строке, как Вы обрабатываете различные версии? Как Вы перемещаете базу данных от X-> Y? Или хуже от A-> D? Я вижу проблемы, где мы хранили сериализировать объект в поле BLOB и должны переместить клиента через несколько версий.

0
ответ дан 1 December 2019 в 01:00
поделиться

Можно оптимизировать сериализацию путем воплощения объекта. Это даст Вам полный контроль над тем, как он сериализируется, и улучшите производительность процесса. Это просто сделать, пока Ваш POJO прост (т.е. не имеет ссылок на другие объекты), иначе можно легко повредить сериализацию.

учебное руководство здесь

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

1
ответ дан 1 December 2019 в 01:00
поделиться

При использовании разделителя, Вы могли бы использовать символ, который Вы, никогда знаете не происходил бы в Вашем тексте такой как \0, или специальные символы http://unicode.org/charts/symbols.html

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

1
ответ дан 1 December 2019 в 01:00
поделиться

У меня есть определенный POJO, который должен быть сохранен на базе данных, текущий дизайн указывает свое поле как единственный строковый столбец и добавление, что дополнительные поля к таблице не являются опцией.

Могли Вы составлять новую таблицу и помещать внешний ключ в тот столбец!?!?:) Я подозреваю не, но давайте покроем все основания!

Сериализация: у нас недавно было это обсуждение так, чтобы, если наши сбои приложения мы можем возродить его в том же состоянии как ранее. Мы по существу диспетчеризируем событие постоянства на очередь, и затем это захватывает объект, блокирует его и затем сериализирует его. Это кажется довольно быстрым. Сколько данных Вы сериализируете? Можно ли сделать какой-либо переходный процесс переменных (т.е. кэшируемые переменные)? Можно ли рассмотреть разделение сериализации?Остерегайтесь: что происходит, если Ваши объекты изменяются (блокировка) или изменение классов (другой идентификатор сериализации)? Необходимо будет обновить все, что это сериализируется к последним классам. Возможно, только необходимо ли сохранить это в течение ночи, таким образом, это не имеет значения?

XML: Вы могли использовать что-то как xstream для достижения этого. Создание чего-то пользовательского является выполнимым (хороший вопрос об интервью!), но я, вероятно, не сделал бы этого сам. Почему беспокойство? Помните, есть ли у Вас циклические ссылки или если у Вас есть referencs к объектам несколько раз. Восстановление объектов не вполне таким образом тривиально.

Устройство хранения данных базы данных: Если Вы используете Oracle 10 г, чтобы сохранить блобы, обновить до последней версии, так как c/blob производительность в широком масштабе увеличен. Если мы говорим большие объемы данных, то, возможно, архивируют поток вывода?

Действительно ли это - приложение в реальном времени или там будет секундой или двумя паузами, где можно безопасно сохранить фактический объект? Если у Вас есть время, то Вы могли клонировать его и затем сохранить клон на другом потоке. Для чего постоянство? Действительно ли очень важно, что это сделало в транзакции?

0
ответ дан 1 December 2019 в 01:00
поделиться

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

Если Вы не возражаете против другой зависимости, Гессиан является, предположительно, более эффективным способом сериализировать объекты Java.

2
ответ дан 1 December 2019 в 01:00
поделиться

Рассмотрите помещение данных в a Properties возразите и используйте load()/store() сериализация. Это - основанная на тексте техника, таким образом, это все еще читаемо в базе данных:

public String getFieldsAsString() {
  Properties data = new Properties();
  data.setProperty( "foo", this.getFoo() );
  data.setProperty( "bar", this.getBar() );
  ...
  ByteArrayOutputStream out = new ByteArrayOutputStream();
  data.store( out, "" );
  return new String( out.toByteArray(), "8859-1" );   //store() always uses this encoding
}

Для загрузки от строки сделайте подобное использование нового Properties объект и load() данные.

Это лучше, чем сериализация Java, потому что это очень читаемо и компактно.

Если Вы нуждаетесь в поддержке для различных типов данных (т.е. не только Строка), используйте BeanUtils для преобразования каждого поля в и от строкового представления.

3
ответ дан 1 December 2019 в 01:00
поделиться

XStream или YAML или OGNL приходят на ум как легкие методы сериализации. XML был наиболее распространен, но OGNL предоставляет наибольшей гибкости наименьшее количество суммы метаданных.

3
ответ дан 1 December 2019 в 01:00
поделиться

Необходимо рассмотреть управление версиями в решении. Несовместимость данных является проблемой, которую Вы испытаете с любым решением, которое включает использование двоичной сериализации Объекта. Как Вы загружаете более старую строку данных в более новую версию объекта?

Так, решениями, выше которых включают сериализацию к пары имя/значение, является подход, который Вы, вероятно, хотите использовать.

Одно решение состоит в том, чтобы включать номер версии как одно из значений полей. Поскольку новые поля добавлены, изменены или удалены затем, версия может быть изменена.

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

4
ответ дан 1 December 2019 в 01:00
поделиться

Вы могли бы попробовать Буферы Протокола, это - проект с открытым исходным кодом от Google, это, как говорят, быстро (генерирует короче сериализированную форму, чем XML и работает быстрее). Это также обрабатывает добавление нового поля мягко (вставляет значения по умолчанию).

12
ответ дан 1 December 2019 в 01:00
поделиться

Как насчет стандартного механизма персистентности JavaBeans:

java.beans.XMLEncoder
java.beans.XMLDecoder

Они могут создать Java POJOs из XML (которые были сохранены к XML). Из памяти это смотрит (что-то) как...

<object class="java.util.HashMap">
    <void method="put">
        <string>Hello</string>
        <float>1</float>
    </void>
</object>

Необходимо обеспечить PersistenceDelegate классы так, чтобы это знало, как сохранить пользовательские классы. Принятие Вас не удаляет открытых методов, это эластично к изменениям схемы.

2
ответ дан 1 December 2019 в 01:00
поделиться

Вы можете попробовать Preon . Preon стремится быть для двоично-кодированных данных тем же, что Hibernate для реляционных баз данных и JAXB для XML.

0
ответ дан 1 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: