如何使用 jmsserializer 选择要序列化/反序列化的驱动程序


How to choose the driver to serialize/deserialize with jmsserializer

我有一个使用注释序列化的对象。它工作正常。

如果我使用的是yaml配置,它也可以正常工作。

我的问题是我想在不同的上下文中使用两者。假设在控制器 1 中,我想使用注释配置,而在控制器 2 中,我想使用 yaml 配置。我想这样做,因为我需要在这些输出中有不同的字段名称。

  • 我尝试仅使用注释用新实例覆盖序列化程序。
  • 我将 jmsserializer 服务配置更改为不使用特定的驱动程序。它有效,但我无法选择要动态激活哪一个。
  • 我尝试在容器中选择驱动程序,但无法使其工作。

这可能吗?我错过了什么吗?

我不

明白你如何实现这一目标。

但是,如果要以不同的方式公开属性,则可以使用排除策略创建对象的不同视图。

例:

/**
 * @JMS'ExclusionPolicy("all")
 * @ORM'Entity
 */
class FooBar
{    
    /**
     * @ORM'Column(type="string")
     * @JMS'Groups({"foo"})
     */
    protected $name; // output 'name'
    /**
     * @ORM'Column(type="string")
     * @JMS'SerializedName("foo_bar_name")
     * @JMS'Accessor(getter="getName", setter="setName")
     * @JMS'Groups({"bar"})
     */
    protected $fooName; // output 'foo_bar_name'
    // ...
    public function setName($name)
    {
        $this->address = $name;
        return $this;
    }
    public function getName()
    {
        return $this->name;
    }
}

像这样,该属性可以用两个不同的名称进行序列化:

use JMS'Serializer'SerializationContext;
$serializer->serialize(new FooBar(), 'json', SerializationContext::create()->setGroups(array('foo')));
//will output $name as 'name'
$serializer->serialize(new FooBar(), 'json', SerializationContext::create()->setGroups(array('bar')));
//will output $fooName as 'foo_bar_name'

请注意,@JMS'SerializedName不是必需的,您可以将其用于自定义名称。

有关详细信息,请参阅文档的排除策略部分。

希望这可以成为您的替代方案。