我有以下XML:
<CinemaListExport>
<Cinema>
....
<screens>
<screen></screen>
<screen></screen>
</screens>
</Cinema>
<Cinema>
....
</Cinema>
<CinemaListExport>我试图将其转换为以下对象:
class CinemaList
{
/**
* @var Cinema[]
*/
public $cinema;
public function __construct()
{
$this->cinema = new ArrayCollection();
}
public function addCinema(Cinema $cinema)
{
$this->cinema[] = $cinema;
}class Cinema
{
fields...
/**
* @var Screen[]
*/
public $screens = [];使用以下代码:
$normalizers = [
new ArrayDenormalizer(),
new ObjectNormalizer(null, null, null, new ReflectionExtractor())
];
$encoders = [new XmlEncoder()];
$serializer = new Serializer($normalizers, $encoders);
$res = $serializer->deserialize($xml, CinemaList::class, 'xml');无论我做什么,我总是能得到以下信息:
class CinemaList#265 (1) {
public $cinema =>
class Doctrine\Common\Collections\ArrayCollection#317 (1) {
private $elements =>
array(0) {
}
}
}谁能给我指明正确的方向?我在这里做错什么了?我只需要CinemaList包含所有电影院,每家电影院都包含所有屏幕
发布于 2019-05-08 17:18:09
那么,我必须开发您的解决方案,并进行了一些搜索,以了解为什么这个简单的用例不起作用。
首先,您错过了规范化程序ArrayDenormalizer,需要取消您的影院和屏幕集合的序列化:
use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
$objectNormalizer = new ObjectNormalizer(null, null, null, new ReflectionExtractor());
$serializer = new Serializer(
[new ArrayDenormalizer(), $objectNormalizer], [new XmlEncoder()]
);如果没有这个规范化器数组和集合,就会跳过。
序列化/非序列化还有另外一件事,尤其是使用ObjectNormalizer组件的PropertyAccess。
如果要使方法adder和remover工作,就必须同时实现它。
PropertyAccessor::writeProperty方法中发生了很多事情。我不会解释所有的机制主义,但很快:如果您有addXXX和removeXXX方法,那么addXXX将被优先使用。保重!如果您只有addXXX方法,那么它将不被使用…我不知道他们为什么这么做,但肯定有一个很好的理由。第二个选项是策划者。如果它存在(而且您没有removeXXX或addXXX),那么它将用于从集合中添加项。
来自这里
我在一个新的symfony项目中做了一些成功的测试。如果你还遇到问题,我很乐意帮你。
https://stackoverflow.com/questions/56041446
复制相似问题