【发布时间】: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,但没有任何运气。
类似问题:
- Serializing and Deserializing in Symfony 将使用字符串的答案标记为正确但不是真的,如果您阅读 cmets,您会发现它并没有真正解决问题。
-
Could not denormalize object of type, no supporting normalizer found. Symfony 2.8 在 cmets 中,OP 说使用
ClassName::class有效,但这对我不起作用。 -
Problems try encode entity to json 答案是停止使用
symfony/serializer并改用jms/serializer。用 Symfony 的序列化器真的不行吗?
感谢您的帮助
【问题讨论】:
标签: php symfony serialization