在 Symfony 中反序列化日期时间

use*_*660 5 symfony deserialization symfony-3.3

尝试在 Symfony 3.3 中使用序列化器组件。我与具有“DateTime”成员的实体斗争。

我的 config.yml 序列化程序初始化:

serializer:
    enable_annotations: true
Run Code Online (Sandbox Code Playgroud)

在 service.yml 中添加了这个:

datetime_method_normalizer:
    class: Symfony\Component\Serializer\Normalizer\DateTimeNormalizer
    public: false
    tags: [serializer.normalizer]
Run Code Online (Sandbox Code Playgroud)

反序列化后的代码如下所示:

$yml = [...]   // It was created by serializer->serialize()
$serializer = $this->get('serializer');
$myObject = $serializer->deserialize($yml, MyObject::class, "yaml");
Run Code Online (Sandbox Code Playgroud)

错误是: Expected argument of type "DateTime", "string" given在 vendor/symfony/symfony/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php(第 204 行)

我认为 DateTimeNormalizer::denormalize 永远不会被调用。知道如何让它恢复生机吗?

信息:DateTimeNormalizer::__constructor() 被调用。

小智 0

唯一的官方方法似乎是声明callback

$callback = function ($dateTime) {
return $dateTime instanceof \DateTime
    ? $dateTime->format(\DateTime::ISO8601)
    : '';
};

$normalizer->setCallbacks(array('createdAt' => $callback));
$serializer = new Serializer(array($normalizer), array($encoder));
Run Code Online (Sandbox Code Playgroud)

https://symfony.com/doc/current/components/serializer.html#using-callbacks-to-serialize-properties-with-object-instances

  • 我认为这个答案是错误的。`AbstractNormalizer::setCallbacks` 方法_仅_应用规范化器,而不应用反规范化器。规范化器将类型化值转换为数组值,准备编码为序列化字符串。问题是关于另一个方向:将数组值反规范化回类型值,作为从编码到对象的反序列化过程的一部分。 (6认同)