Хорошо, мне удалось придумать метод обхода, подобный этому:
||
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;
Я проверил это, и теперь это работает, дайте мне знать, если есть лучший способ.
Elliot Rusty Harold описал хороший аргумент против использования Сериализации объекта Java для объектов в его библиотеке XOM. Те же принципы относятся к Вам. Встроенная сериализация Java является определенной для Java, хрупкой, и медленной, и лучшая избегаемый - также.
У Вас есть примерно верная мысль в использовании Основанного на операция со строками формата. Проблема, как Вы заявляете, состоит в том, что Вы сталкиваетесь с проблемами форматирования/синтаксиса с разделителями. Решение состоит в том, чтобы использовать формат, который уже создается для обработки этого. Если это - стандартизированный формат, то можно также потенциально использовать другие библиотеки/языки для управления им. Кроме того, основанный на операция со строками формат означает, что у Вас есть надежда на понимание его только визуальным контролем данные; двоичные форматы удаляют ту опцию.
XML и JSON являются двумя большими опциями здесь; они стандартизированы, основаны на тексте, гибкие, читаемые, и иметь большую поддержку библиотеки. Они будут также работать удивительно хорошо (иногда еще быстрее, чем сериализация Java).
Вы изучили JAXB? Это - механизм, которым можно определить комплект объектов Java, которые создаются из XML-схемы. Это позволяет Вам упорядочивать от иерархии объектов до XML или не упорядочивать XML назад в иерархию объектов.
Я буду второе предложение для использования JAXB, или возможно XStream (прежний быстрее, последний имеет больше внимания на часть сериализации объекта). Плюс, я далее предложу достойную основанную на JSON альтернативу, Jackson (http://jackson.codehaus.org/Tutorial), который может полностью бобы сериализатора/десериализовывать к тексту JSON для хранения в столбце.
О, и я абсолютно соглашаюсь в этом, не используют двоичную сериализацию Java ни при каких обстоятельствах для долгосрочного хранения данных. То же идет для Буферов Протокола; оба слишком хрупки с этой целью (они лучше для передачи данных между плотно двойными системами).
Рассмотрите изменение Вашей схемы. Даже если Вы находите быстрый способ сериализировать POJO к строке, как Вы обрабатываете различные версии? Как Вы перемещаете базу данных от X-> Y? Или хуже от A-> D? Я вижу проблемы, где мы хранили сериализировать объект в поле BLOB и должны переместить клиента через несколько версий.
Можно оптимизировать сериализацию путем воплощения объекта. Это даст Вам полный контроль над тем, как он сериализируется, и улучшите производительность процесса. Это просто сделать, пока Ваш POJO прост (т.е. не имеет ссылок на другие объекты), иначе можно легко повредить сериализацию.
Править: Не допущение это - предпочтительный подход, но Вы очень ограничены в своих опциях, если ti является очень важной производительностью, и можно только использовать строковый столбец в таблице.
При использовании разделителя, Вы могли бы использовать символ, который Вы, никогда знаете не происходил бы в Вашем тексте такой как \0, или специальные символы http://unicode.org/charts/symbols.html
Однако время потратило отправку данных к базе данных, и сохранение его, вероятно, будет намного больше, чем стоимость сериализации. Таким образом, я предложил бы запуститься с некоторой вещи, простой и легкой для чтения (как XStream) и взгляд на то, где приложение проводит большую часть своего времени, и оптимизируйте это.
У меня есть определенный POJO, который должен быть сохранен на базе данных, текущий дизайн указывает свое поле как единственный строковый столбец и добавление, что дополнительные поля к таблице не являются опцией.
Могли Вы составлять новую таблицу и помещать внешний ключ в тот столбец!?!?:) Я подозреваю не, но давайте покроем все основания!
Сериализация: у нас недавно было это обсуждение так, чтобы, если наши сбои приложения мы можем возродить его в том же состоянии как ранее. Мы по существу диспетчеризируем событие постоянства на очередь, и затем это захватывает объект, блокирует его и затем сериализирует его. Это кажется довольно быстрым. Сколько данных Вы сериализируете? Можно ли сделать какой-либо переходный процесс переменных (т.е. кэшируемые переменные)? Можно ли рассмотреть разделение сериализации?Остерегайтесь: что происходит, если Ваши объекты изменяются (блокировка) или изменение классов (другой идентификатор сериализации)? Необходимо будет обновить все, что это сериализируется к последним классам. Возможно, только необходимо ли сохранить это в течение ночи, таким образом, это не имеет значения?
XML: Вы могли использовать что-то как xstream для достижения этого. Создание чего-то пользовательского является выполнимым (хороший вопрос об интервью!), но я, вероятно, не сделал бы этого сам. Почему беспокойство? Помните, есть ли у Вас циклические ссылки или если у Вас есть referencs к объектам несколько раз. Восстановление объектов не вполне таким образом тривиально.
Устройство хранения данных базы данных: Если Вы используете Oracle 10 г, чтобы сохранить блобы, обновить до последней версии, так как c/blob производительность в широком масштабе увеличен. Если мы говорим большие объемы данных, то, возможно, архивируют поток вывода?
Действительно ли это - приложение в реальном времени или там будет секундой или двумя паузами, где можно безопасно сохранить фактический объект? Если у Вас есть время, то Вы могли клонировать его и затем сохранить клон на другом потоке. Для чего постоянство? Действительно ли очень важно, что это сделало в транзакции?
Я сказал бы, что Ваш начальный подход не все это плохо, если Ваш POJO состоит из Строк и типов примитивов. Вы могли осуществить выход разделителя для предотвращения повреждений. Также, если Вы используете, в спящем режиме, Вы инкапсулируете сериализацию в пользовательском типе.
Если Вы не возражаете против другой зависимости, Гессиан является, предположительно, более эффективным способом сериализировать объекты Java.
Рассмотрите помещение данных в 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 для преобразования каждого поля в и от строкового представления.
XStream или YAML или OGNL приходят на ум как легкие методы сериализации. XML был наиболее распространен, но OGNL предоставляет наибольшей гибкости наименьшее количество суммы метаданных.
Необходимо рассмотреть управление версиями в решении. Несовместимость данных является проблемой, которую Вы испытаете с любым решением, которое включает использование двоичной сериализации Объекта. Как Вы загружаете более старую строку данных в более новую версию объекта?
Так, решениями, выше которых включают сериализацию к пары имя/значение, является подход, который Вы, вероятно, хотите использовать.
Одно решение состоит в том, чтобы включать номер версии как одно из значений полей. Поскольку новые поля добавлены, изменены или удалены затем, версия может быть изменена.
При десериализации данных у Вас могут быть различные обработчики десериализаций для каждой версии, которая может использоваться для преобразования данных от одной версии до другого.
Вы могли бы попробовать Буферы Протокола, это - проект с открытым исходным кодом от Google, это, как говорят, быстро (генерирует короче сериализированную форму, чем XML и работает быстрее). Это также обрабатывает добавление нового поля мягко (вставляет значения по умолчанию).
Как насчет стандартного механизма персистентности 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
классы так, чтобы это знало, как сохранить пользовательские классы. Принятие Вас не удаляет открытых методов, это эластично к изменениям схемы.
Вы можете попробовать Preon . Preon стремится быть для двоично-кодированных данных тем же, что Hibernate для реляционных баз данных и JAXB для XML.