#powershell
Вопрос:
Плакат в первый раз.
У меня есть проект, который требует запроса данных из базы данных сайта MySQL WordPress. Некоторые из этих данных сериализуются, поэтому мой вопрос: есть ли в powershell опция, эквивалентная методу PHP unserialize ()?
Спасибо.
Комментарии:
1. Как сериализовать? Обратите внимание, что «сериализация» — это всего лишь общее название для преобразования объекта в строковый или двоичный формат; не существует единого канонического способа сериализации. Если он сериализуется так, как десериализуется PHP, то нет, в PowerShell нет собственного командлета для десериализации данных, сериализованных PHP. Безусловно, можно было бы написать одну из них, и, возможно, уже существуют библиотеки, которые это делают, хотя рекомендовать любую из них было бы не по теме для ЭТОГО.
2.
unserialize()
превращает строку в объект времени выполнения PHP — PowerShell не является PHP 🙂3. Я предполагаю, что операция сохранила некоторые данные в базе данных, используя функцию PHP serialise (), и теперь хочет удалить их в Powershell, чтобы выполнить некоторую обработку. Вот формат сериализации PHP для всех, кто заинтересован… en.m.wikipedia.org/wiki/PHP_serialization_format
4. Спасибо за комментарии и пояснения. Мой технический контакт только упомянул, что поля были сериализованы с помощью PHP WordPress. Вот пример данных, если это поможет: Оригинал: a:2:{i:0;s:2:»28″;i:1;s:2:»24″;} Прошел через PHP метод несериализации: Массив ( [0] => 28 [1] =>> 24 ) В качестве обходного пути я запускаю данные через PHP и удаляю их через Powershell. Это работает, однако медленно. Мне просто было интересно, существует ли функция или библиотека сообщества, которая была бы более эффективной. Судя по звукам, это не основано на моих поисках. Спасибо за всю вашу помощь.
Ответ №1:
Это зависит от того, как ваши данные были сериализованы.
Если вы собираетесь сериализовать с помощью Powershell, сохраните его в базе данных, а затем десериализуйте, вы можете сделать это:
$serialized = [System.Management.Automation.PSSerializer]::Serialize($myObject)
[System.Management.Automation.PSSerializer]::Deserialize($serialized)
если вы сериализовали base64 в UTF8, вы можете сделать это:
[Management.Automation.PSSerializer]::Deserialize([Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($YourData)))
Вы также можете сохранить данные (сериализованные или нет) в формате JSon, а затем вернуть объект, что вы можете сделать ConvertFrom-Json
. Я подготовил этот пример: https://code.labstack.com/-fHqQaRl
$myObject = @{a=1; b=2}
$myJsonObject = ConvertTo-Json $myObject
$mySerializedJsonObject = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($myJsonObject))
# Deserializing:
$myDeserializedJsonObject = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($mySerializedJsonObject))
$myDeserializedObject = ConvertFrom-Json $myDeserializedJsonObject
Write-Verbose "My initial object: $($myObject.a)" -Verbose
Write-Verbose "My Json object: $myJsonObject" -Verbose
Write-Verbose "My Serialized object: $mySerializedJsonObject" -Verbose
Write-Verbose "My Deserialized Json: $myDeserializedJsonObject" -Verbose
Write-Verbose "My deserialized object: $($myDeserializedObject.a)" -Verbose
Вывод:
VERBOSE: My initial object: 1
VERBOSE: My Json object: {
"a": 1,
"b": 2
}
VERBOSE: My Serialized object: ewAKACAAIAAiAGEAIgA6ACAAMQAsAAoAIAAgACIAYgAiADoAIAAyAAoAfQA=
VERBOSE: My Deserialized Json: {
"a": 1,
"b": 2
}
VERBOSE: My deserialized object: 1