Php Symfony序列化程序将XML反序列化为具有子对象的对象
我有以下XML:Php Symfony序列化程序将XML反序列化为具有子对象的对象,php,serialization,symfony4,Php,Serialization,Symfony4,我有以下XML: <CinemaListExport> <Cinema> .... <screens> <screen></screen> <screen></screen> </screens> </Cinema> <Cinema> ....
<CinemaListExport>
<Cinema>
....
<screens>
<screen></screen>
<screen></screen>
</screens>
</Cinema>
<Cinema>
....
</Cinema>
<CinemaListExport>
使用以下代码:
$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来包含所有的电影院和每个电影院来包含所有的屏幕好吧,我必须开发您的解决方案并进行一些搜索,以了解为什么这个简单的用例不起作用 首先,您错过了normalizer
ArraydNormalizer
它需要取消影院和屏幕集合的序列化:
使用Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;
使用Symfony\Component\Serializer\Encoder\xmlcoder;
使用Symfony\Component\Serializer\Normalizer\arraydesnormalizer;
使用Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
使用Symfony\Component\Serializer\Serializer;
$objectNormalizer=newObjectNormalizer(null,null,null,newReflectionExtractor());
$serializer=新序列化程序(
[new ArrayDenormalizer(),$objectNormalizer],[new XmlEncoder()]
);
如果没有这个规范化器,数组和集合将被跳过
序列化/非序列化还有另一个方面,特别是使用PropertyAccess
组件的ObjectNormalizer
如果你想让它工作,你必须同时实现加法器和移除器
在PropertyAccessor::writeProperty方法中发生了很多事情。我不会解释所有的mecanism,但很快:如果您有addXXX和removeXXX方法,那么addXXX将优先使用。当心!如果你只有addXXX方法,那么它将不会被使用…我不知道他们为什么这样做,但肯定有一个很好的理由。
第二个选项是setter。如果它存在(并且您没有removeXXX或addXXX),那么它将用于添加集合中的项目
从
我在一个新的symfony项目中做了一些成功的测试。如果您仍然遇到问题,我很乐意帮助您。谢谢。我正在审查的链接,并将尝试它。不知道为什么这个序列化程序需要如此复杂。。。
$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) {
}
}
}