1

反序列化的 JMS Serializer 1.* 仅填充输入中提供的那些字段。例如,我们有如下代码:

$criteria = $this->serializer->deserialize($request->getContent(), SearchCriteria::class, 'json');

当请求中没有limit提供字段时,它采用默认值,在类属性中定义,即

class SearchCriteria {
    // ...
    private $limit = 10;
    // ...
}

这种行为在迁移到 JMS Serializer 2.0 后发生了变化——现在它limit用 null 覆盖了字段,这破坏了我们的逻辑。有没有办法配置旧行为?我们使用带有 jms/serializer-bundle@3.0.0 的 Symfony 4。

这里是jms_serializer.yaml

jms_serializer:
    default_context:
        serialization:
            serialize_null: false
        deserialization:
            serialize_null: false
4

1 回答 1

2

所以到目前为止我发现的最好的解决方法是使用 PostDeserialize 注释(https://jmsyst.com/libs/serializer/master/reference/annotations#postdeserialize)并手动设置默认值,例如:

/**
 * @JMS\PostDeserialize()
 */
public function postDeserialize()
{
    $this->limit = $this->limit ?? 10;
}

它看起来丑陋但有效。

于 2018-11-29T08:59:56.680 回答