JMS 序列化器和枚举

问题描述 投票:0回答:1

此代码片段来自文档

    # config.yml
    jms_serializer:
        profiler: %kernel.debug%
        enum_support: true # PHP 8.1 Enums support, false by default for backward compatibility
        default_value_property_reader_support: true # PHP 8.0 Constructor Promotion default value support, false by default for backward compatibility
        twig_enabled: 'default' # on which instance is twig enabled
        handlers:
            datetime:
                default_format: "Y-m-d\\TH:i:sP" # ATOM
                default_timezone: "UTC" # defaults to whatever timezone set in php.ini or via date_default_timezone_set
            array_collection:
                initialize_excluded: false
            symfony_uid:
                default_format: "canonical"
                cdata: true

我正在尝试在 Symfony 上的一个项目中进行设置。

jms_serializer:
    enum_support: true
    default_value_property_reader_support: true

我使用 DI SerializerInterface 创建序列化器

public function __construct(
    private SerializerInterface $jmsSerializer
) {
}

当我尝试反序列化 json 时< I catch error: The provided class

"App\\...\\Enumeration\\DocumentDescribeTypeEnum\" is an enum, and cannot be instantiated

如何解决?

php symfony serialization jmsserializerbundle
1个回答
0
投票

我认为查看类的(反)序列化配置(注释、YAML 等)会很有帮助。 然而,以下内容可能会为您和其他人指明正确的方向。

我也想反序列化枚举,并且在某个时间看到了与您相同的错误。 我们使用 JMS Serializer 作为独立库,并且我们的配置位于 YAML 中。

就我而言,我需要做两件事:

  1. 启用对枚举的支持,例如:
$serializer = SerializerBuilder::create()
    ->enableEnumSupport()  // <-- This is the key bit
    ->build()
;
  1. 正确配置属性,例如:
Fully\Qualified\Class\Name:
    properties:
        foo:
            expose: true
            type: enum<'Fully\Qualified\Enum\Name'>  # <-- This is the key bit

注意至少在 YAML 中,枚举的完全限定名称周围的引号是必需的——鉴于我在 JMS Serializer 代码中看到的内容,我希望如果您使用注释,同样的情况也适用。

© www.soinside.com 2019 - 2024. All rights reserved.