Я застрял, пытаясь десериализовать XML, используя Serializer Symfony (Symfony 5).
Я поместил минимальную версию проблемы в репозиторий ( https://github.com/tacman/xml-serializer-demo), вот быстрая установка:
git clone https://github.com/tacman/xml-serializer-demo.git bug && cd bug && composer install && bin/console app:demo
Сериализация работает (поэтому конфигурация кажется правильной), но десериализация - нет.
Цель: чтение и запись, вложенные XML с атрибутами
<?xml version="1.0"?>
<product description="Wool sweater">
<property name="color">blue</property>
<property name="size">small</property>
</product>
Объекты Product и Properties являются тривиальными и создаются с помощью bin / console make: entity
Сериализатор настроен таким образом, что описание продукта и имя свойства являются атрибутами.
# config/serialization.yaml
App\Entity\Product:
attributes:
description:
serialized_name: '@description'
groups: ['xml']
properties:
serialized_name: 'property'
groups: ['xml']
App\Entity\Property:
attributes:
name:
serialized_name: '@name'
groups: ['xml']
value:
serialized_name: '#'
groups: ['xml']
Простой продукт создается и выгружается и отлично работает:
$product = (new Product())
->setDescription("Wool sweater");
$product
->addProperty((new Property())->setName('color')->setValue('blue'))
->addProperty((new Property())->setName('size')->setValue('small'))
;
$context = [
'xml_root_node_name' => 'product',
'groups' => ['xml'],
'xml_standalone' => false,
'xml_format_output' => true,
];
$xml = $this->serializer->serialize($product, 'xml', $context);
Но десериализация не работает.
/** @var Product $product2 */
$product2 = $this->serializer->deserialize($xml, Product::class, 'xml');
dump($product2); // nothing is set :-(
Я пробовал взлом в XMLEncoder и Object Normalizer, но я что-то упустил. Спасибо!