使用Symfony Serializer进行XML序列化时如何正确分组数组
问题根因
Symfony序列化组件的XML编码器默认不会为对象的数组/集合类型属性自动生成外层包裹标签,会直接将集合内的子元素平铺到当前对象的节点下,这就是你当前输出缺少<products>包裹层的原因。
解决方案
有两种常用配置方式可以实现你需要的XML结构:
方式1:使用序列化注解(推荐,可复用性高)
- 首先确认
config/packages/framework.yaml中开启了序列化注解支持:
framework: serializer: enable_annotations: true
- 给
Ticket类的$products属性添加序列化注解:
use Symfony\Component\Serializer\Annotation\SerializedName; use Symfony\Component\Serializer\Annotation\XmlCollection; class Ticket { private string $uuid; /** * @var Product[]|array $products * @SerializedName("products") * @XmlCollection(entryName="product") */ private array $products; // 原有getter、setter保持不变 }
配置完成后直接调用原有序列化方法即可输出符合预期的XML结构。
方式2:在序列化时传入上下文配置(适合单次使用场景)
如果不想修改实体类的注解,可以在调用序列化方法时通过上下文参数指定集合映射规则:
$this->serializer->serialize($data, 'xml', [ 'xml_encoding' => 'utf-8', 'xml_collection_map' => [ 'products' => 'product' ] ]);
内容的提问来源于stack exchange,提问作者davrodrila
相关产品推荐
相关产品推荐

