json_encode сериализовать нулевые байты

Сегодня я столкнулся с этой сериализацией gotcha . Из документа PHP.net:

Примечание: К частным членам объекта добавляется имя класса. имя; защищенные члены имеют перед именем члена "*". Эти добавленные значения имеют нулевых байта с обеих сторон .

Я использую debug_backtrace для создания трассировки для отчета об отладке, который получает json_encode d. Внутри он использует сериализатор для генерации данных для трассировки.

Это (частичный) вывод json_encode :

{"\u0000MyObject\u0000my_var":[]}

Проблема в том, что json_decode не может обработайте это, он будет жаловаться на нулевые байты.

Итак json_encode успешно записывает нулевые байты, которые json_decode не может декодировать. Мне это кажется немного странным. Я ожидал, что json_encode позаботится о необходимом экранировании, или, по крайней мере, json_decode может анализировать все, что создано json_encode , но это не похоже на case.

Думаю, у меня есть несколько решений:

  • Убрать нулевые байты из трассировки, меня не так сильно интересует десериализация объекта, мне просто нужно строковое представление.
  • Удалите все частные переменные вместе из трассировки.
  • Исправьте json_encode , чтобы он не производил нулевые байты
  • Исправьте json_decode , чтобы он принимал нулевые байты

Кто-нибудь сталкивался с этой проблемой и как вы это исправили?


Пример:


Решение

Начиная с PHP 5.3 call_user_func_array выдаст предупреждение, когда второй параметр call_user_func_array не является массивом. А пока вам придется проверить это самостоятельно.

6
задан Halcyon 25 July 2011 в 10:05
поделиться