我正在尝试使用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
,但没有成功。类似的问题:
- 在Symfony中进行序列化和反序列化标记了一个使用字符串作为正确答案,但如果你读评论,你会发现它并没有真正解决问题。
- 无法对类型为“no supporting normalizer found”的对象进行反规范化。Symfony 2.8 在评论中,OP说使用
ClassName::class
可以工作,但这对我没用。 - 尝试将实体编码为json时遇到问题 答案是停止使用
symfony/serializer
,改用jms/serializer
。Symfony的序列化器真的不行吗?