Php Symfony序列化程序无法反序列化为\DateTime
我试图用Symfony序列化程序将json反序列化为DTO,但我总是得到异常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/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。