#php #symfony #serialization #deserialization
Вопрос:
Я пытаюсь сохранить объект в виде файла json. Класс сущностей также включает поле даты и времени:
class Ear
{
...
/**
* @ORMColumn(type="date")
*/
private $date;
...
}
Затем я создаю новое Ухо:
$earLine = new Ear();
$earLine->setDate(new DateTime());
Теперь я просто думаю, что могу нормализовать и сериализовать этот объект:
$encoders = [new JsonEncoder()];
$normalizers = [new DateTimeNormalizer(), new ObjectNormalizer()];
$serializer = new Serializer($normalizers, $encoders);
$json = $serializer->serialize($earLine, 'json');
что прекрасно работает. Json выглядит так:
{
"id": null,
"date": "2021-05-31T00:00:00 02:00",
...
}
Однако при попытке десериализации он не может денормализовать дату и время.
$encoders = [new JsonEncoder()];
$normalizers = [new DateTimeNormalizer(), new ObjectNormalizer()];
$serializer = new Serializer($normalizers, $encoders);
dd($serializer->deserialize($json, Ear::class, 'json'));
с ошибкой Failed to denormalize attribute "date" value for class "AppEntityEar": Expected argument of type "DateTimeInterface", "string" given at property path "date".
Я читаю документы вверх и вниз и ищу stackoverflow. Но это не удается по непонятной причине, по крайней мере, для меня.
Использование Symfony 5.3.
Комментарии:
1. Не могли бы вы добавить сериализованный JSON в вопрос?
2. Я только что протестировал ваш код с PHP FPM 7.4.18 и Symfony 4.4.26, там он отлично работает. Для этого примера мой класс
Ear
содержал толькоdate
. Может быть, это полезная информация для вас.3. @KhorneHoly спасибо. Обновил сообщение с помощью сериализованного JSON.
4. @KhorneHoly Я прокомментировал все остальные свойства для целей тестирования. Все та же ошибка:
Serializer->deserialize(array('id' => null, 'date' => '2021-05-31T00:00:00 02:00'), 'App\Entity\Ear', 'json')
— работает на Devilbox PHP 7.35. Не могли бы вы проверить использование кодера, Нормализатора и сериализатора? Может быть, вы случайно используете компонент из другого пакета вместо symfony?