【问题标题】:Symfony Serializer doesn't deserialize into objects in different namespace: 'no supporting normalizer found'Symfony 序列化器不会反序列化为不同命名空间中的对象:“找不到支持的规范化器”
【发布时间】:2017-02-16 20:46:21
【问题描述】:

我正在尝试通过 composer 使用包 symfony/serializer 和 symfony/property-access 将 json 反序列化为一个对象。当我要反序列化的类在同一个文件中时,它可以工作,但当它在其他地方时(甚至不是同一个命名空间中的不同文件)就不行。 我有以下代码:

<?php // Somewhere/Foo.php
namespace Somewhere;
class Foo
{
    private $foo;
    public function getFoo() { return $this->foo; }
    public function setFoo($foo) { $this->foo = $foo; }
}

还有:

<?php // file tests/Test.php
namespace tests;

use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Somewhere\Foo;

class Foo2
{
    private $foo;
    public function getFoo() { return $this->foo; }
    public function setFoo($foo) { $this->foo = $foo; }
}

class Test extends \PHPUnit_Framework_TestCase
{

    public function testFoo()
    {
        $encoders = array(new XmlEncoder(), new JsonEncoder());
        $normalizers = array(new ObjectNormalizer(), new GetSetMethodNormalizer());
        $serializer = new Serializer($normalizers, $encoders);
        $payload = '{"foo": {"bar": "baz"}}';

        $obj = $serializer->deserialize($payload, Foo::class, 'json');
        $this->assertInstanceOf(Foo::class, $obj);
    }

    public function testFoo2()
    {
        $encoders = array(new XmlEncoder(), new JsonEncoder());
        $normalizers = array(new ObjectNormalizer(), new GetSetMethodNormalizer());
        $serializer = new Serializer($normalizers, $encoders);
        $payload = '{"foo": {"bar": "baz"}}';

        $obj = $serializer->deserialize($payload, Foo2::class, 'json');
        $this->assertInstanceOf(Foo2::class, $obj);
    }
}

使用本地类 (Foo2) 的测试工作正常,但在不同命名空间 (\Somewhere\Foo) 中使用该类的测试向我显示此错误: Symfony\Component\Serializer\Exception\UnexpectedValueException: Could not denormalize object of type Somewhere\Foo, no supporting normalizer found.

我也尝试过使用 \Somewhere\Foo::class'Foo''\Somewhere\Foo' 而不是 Foo::class,但没有任何运气。

类似问题:

感谢您的帮助

【问题讨论】:

    标签: php symfony serialization


    【解决方案1】:

    出现错误是因为Foo 类在此上下文中不存在,您可能忘记将此文件Somewhere/Foo.php 包含到自动加载中。

    在您的示例中,这应该可以工作!

    <?php // file tests/Test.php
    
    namespace tests;
    
    include 'Somewhere/Foo.php';
    
    //...
    

    如果 Foo 类位于同一目录中,PHPStorm 等一些编辑器可以自动导入该类而不会显示任何错误。

    【讨论】:

    • 是的,我将它添加到作曲家的自动加载器中,现在它可以工作了。谢谢!
    猜你喜欢
    • 2017-01-27
    • 2018-02-19
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 2014-01-23
    相关资源
    最近更新 更多