Symfony序列化器无法将对象反序列化到不同命名空间中:'没有找到支持的规范化程序'。

3

我正在尝试使用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,但没有成功。
类似的问题: 感谢帮助。
1个回答

3
错误发生的原因是当前上下文中不存在 Foo 类,您可能忘记将文件 Somewhere/Foo.php 加入到自动加载中了。

在您的示例中,这应该可以解决问题!

<?php // file tests/Test.php

namespace tests;

include 'Somewhere/Foo.php';

//...

一些编辑器如PHPStorm,如果Foo类在同一个目录中,则能够自动导入它而不显示任何错误。


是的,我已将它添加到Composer的自动加载器中,现在它可以工作了。谢谢! - solarc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接