Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony序列化程序无法反序列化为\DateTime_Php_Json_Symfony_Datetime_Serialization - Fatal编程技术网

Php Symfony序列化程序无法反序列化为\DateTime

Php Symfony序列化程序无法反序列化为\DateTime,php,json,symfony,datetime,serialization,Php,Json,Symfony,Datetime,Serialization,我试图用Symfony序列化程序将json反序列化为DTO,但我总是得到异常Symfony/Component/Serializer/exception/MissingConstructorArgumentsException,消息是“无法从序列化数据创建DateTime实例,因为其构造函数要求参数“time”存在。” 我的DTO如下所示: [ { "result":{ "operations":{ "successful":319698,

我试图用Symfony序列化程序将json反序列化为DTO,但我总是得到异常
Symfony/Component/Serializer/exception/MissingConstructorArgumentsException,消息是“无法从序列化数据创建DateTime实例,因为其构造函数要求参数“time”存在。”

我的DTO如下所示:

[
  {
    "result":{
      "operations":{
        "successful":319698,
        "failed":2,
        "total":319700
      }
    },
    "creationDate":"2020-02-10T03:01:53.357Z"
  },
  // …
]
类响应到
{
/**@var\DateTime*/
私人$creationDate;
/**@var NestedObject*/
私人$result;
公共函数构造(
\DateTime$creationDate,
NestedObject$结果
) { /* … */ }
公共函数getCreationDate():\DateTime
{
返回$this->creationDate;
}
公共函数getResult():NestedObject
{
返回$this->result;
}
}
使用这样的json:

[
  {
    "result":{
      "operations":{
        "successful":319698,
        "failed":2,
        "total":319700
      }
    },
    "creationDate":"2020-02-10T03:01:53.357Z"
  },
  // …
]
反序列化调用也是直截了当的:

$serializer->反序列化(
$data,
ResponseDto::类“[]”,
“json”
);
并且还安装/注册了所有必要的规范化程序(以及symfony/property info包):

$bin/console调试:容器序列化程序--显示参数
服务“序列化程序”的信息
====================================
序列化程序序列化和反序列化数据。
---------------- ----------------------------------------- 
期权价值
---------------- ----------------------------------------- 
服务ID序列化程序
类Symfony\Component\Serializer\Serializer
标签-
公众是的
合成no
懒惰不
共享是
摘要否
自动连线否
自动配置否
参数数组(9个元素))
阵列(5个单元)
---------------- ----------------------------------------- 
$bin/控制台调试:容器--标记序列化程序.normalizer
用“serializer.normalizer”标记的Symfony容器服务
==================================================================
------------------------------------------------- ---------- --------------------------------------------------------------------------- 
服务ID优先级类名
------------------------------------------------- ---------- --------------------------------------------------------------------------- 
fos\u rest.serializer.form\u error\u normalizer-10 fos\RestBundle\serializer\normalizer\FormErrorNormalizer
reporting.reader.serializer Symfony\Component\serializer\serializer
serializer.denormalizer.array-990 Symfony\Component\serializer\Normalizer\ArrayDenormalizer
serializer.normalizer.constraint\u违例\u列表-915 Symfony\Component\serializer\normalizer\ConstraintViolationListNormalizer
serializer.normalizer.data\u uri-920 Symfony\Component\serializer\normalizer\DataUriNormalizer
serializer.normalizer.dateinterval-915 Symfony\Component\serializer\normalizer\DateIntervalNormalizer
serializer.normalizer.datetime-910 Symfony\Component\serializer\normalizer\DateTimeNormalizer
serializer.normalizer.json_serializable-900 Symfony\Component\serializer\normalizer\JsonSerializableNormalizer
serializer.normalizer.object-1000 Symfony\Component\serializer\normalizer\ObjectNormalizer
------------------------------------------------- ---------- --------------------------------------------------------------------------- 
为什么序列化程序无法将数据反序列化为
\DateTime
对象?也会调用
DateTimeNormalizer::supportsDenormalize()
,并为属性返回
true
,但从未调用
DateTimeNormalizer::denormalize()

有趣的事实:如果我将类型提示更改为
\DateTimeInterface
,序列化程序可以反序列化数据,但会生成
\datetimeimmunitable
(不幸的是,我需要
\DateTime
对象)

我发现了问题:

如前所示,有一个标记为
serializer.normalizer
reporting.reader.serializer
服务,但仅配置了一小部分规范化器和编码器:

services:
    reporting.reader.serializer:
        class: Symfony\Component\Serializer\Serializer
        arguments:
            - ['@serializer.normalizer.object']
            - ['@serializer.encoder.csv']
此序列化程序没有优先级,因此在
DateTimeNormalizer
之前调用它。这样,所有对象都由该序列化程序创建,但该序列化程序无法反序列化接口,如
\DateTimeInterface
(这就是此类型提示起作用的原因,我得到了
\datetimeimmustable


我通过为
reporting.reader.serializer
服务设置
autoconfigure:false
解决了这个问题。

我现在没有测试序列化/反序列化过程的设置。就我所阅读的文档而言,我也希望您的代码能够正常工作。在反序列化过程中,将在中创建
DateTime
对象。在您的情况下,我会在抛出异常的行上放置一个调试器断点,并尝试通过遍历所有调试层来找出
数据
不存在的原因。您可以使用调试PHP。