簡體   English   中英

Symfony 序列化程序無法反序列化為 \\DateTime

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM