[英]Symfony serializer cannot deserialize into \DateTime
我正在嘗試使用 Symfony Serializer 將 json 反序列化為 DTO,但我總是收到異常Symfony/Component/Serializer/Exception/MissingConstructorArgumentsException with message 'Cannot create an instance of DateTime from serialized data because its constructor requires parameter "time" to be present.'
.
我的 DTO 看起來像這樣:
class ResponseDto
{
/** @var \DateTime */
private $creationDate;
/** @var NestedObject */
private $result;
public function __construct(
\DateTime $creationDate,
NestedObject $result
) { /* … */ }
public function getCreationDate(): \DateTime
{
return $this->creationDate;
}
public function getResult(): NestedObject
{
return $this->result;
}
}
使用這樣的 json:
[
{
"result":{
"operations":{
"successful":319698,
"failed":2,
"total":319700
}
},
"creationDate":"2020-02-10T03:01:53.357Z"
},
// …
]
反序列化調用也很簡單:
$serializer->deserialize(
$data,
ResponseDto::class . '[]',
'json'
);
並且所有必要的規范化器(以及 symfony/property-info 包)也已安裝/注冊:
$ bin/console debug:container serializer --show-arguments
Information for Service "serializer"
====================================
Serializer serializes and deserializes data.
---------------- -----------------------------------------
Option Value
---------------- -----------------------------------------
Service ID serializer
Class Symfony\Component\Serializer\Serializer
Tags -
Public yes
Synthetic no
Lazy no
Shared yes
Abstract no
Autowired no
Autoconfigured no
Arguments Array (9 element(s))
Array (5 element(s))
---------------- -----------------------------------------
$ bin/console debug:container --tag serializer.normalizer
Symfony Container Services Tagged with "serializer.normalizer" Tag
==================================================================
------------------------------------------------- ---------- ---------------------------------------------------------------------------
Service ID priority Class name
------------------------------------------------- ---------- ---------------------------------------------------------------------------
fos_rest.serializer.form_error_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_violation_list -915 Symfony\Component\Serializer\Normalizer\ConstraintViolationListNormalizer
serializer.normalizer.data_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::supportsDenormalization()
也被調用並返回true
屬性,但DateTimeNormalizer::denormalize()
永遠不會被調用。
有趣的事實:如果我將類型提示更改為\\DateTimeInterface
,序列化程序可以反序列化數據,但會生成\\DateTimeImmutable
(不幸的是我需要\\DateTime
對象)。
我發現了問題:
如前所示,有一個reporting.reader.serializer
服務標記為serializer.normalizer
,但僅配置了一小組規范化器和編碼器:
services:
reporting.reader.serializer:
class: Symfony\Component\Serializer\Serializer
arguments:
- ['@serializer.normalizer.object']
- ['@serializer.encoder.csv']
這個序列化器沒有優先級,所以它在DateTimeNormalizer
之前被調用。 這樣所有對象都由這個序列化器創建,但是這個序列化器不能反序列化像\\DateTimeInterface
這樣的接口(這就是這個類型提示起作用的原因,我得到了\\DateTimeImmutable
)。
我通過為reporting.reader.serializer
服務設置autoconfigure: false
來解決這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.