Сериализация в XML без форматирования (вкладки) с помощью JMS Serializer

Я использую библиотеку xsd2php (которая сама использует jsm-serializer). Когда я сериализую объект, он возвращает форматированный XML, например:

<?xml version="1.0" encoding="UTF-8"?>
<priceRequest>
  <appId>PC</appId>
  <appVersion>3.0</appVersion>
</priceRequest>

Как настроить сериализатор для вывода XML без форматирования, например:

<?xml version="1.0" encoding="UTF-8"?><priceRequest><appId>PC</appId><appVersion>3.0</appVersion></priceRequest>

Прямо сейчас я создаю сериализатор следующим образом:

$serializerBuilder = SerializerBuilder::create();

$serializerBuilder->configureHandlers(function (HandlerRegistryInterface $handler) use ($serializerBuilder) {
    $serializerBuilder->addDefaultHandlers();
    $handler->registerSubscribingHandler(new BaseTypesHandler());
    $handler->registerSubscribingHandler(new XmlSchemaDateHandler());
    $handler->registerSubscribingHandler(new AnyTypeHandler());
});

$this->serializer = $serializerBuilder->build();

А затем просто сериализовать данные:

$this->serializer->serialize($data, $format, $context);

Заранее спасибо.


person sevavietl    schedule 15.02.2018    source источник
comment
Посмотрите здесь Сериализатор JSM — справочник по YAML. Я думаю, вы можете использовать свойства inline. С другой стороны, если вам нужно создать пользовательский обработчик сериализации, возможно, вы можете использовать некоторые свойства сериализатора JMS, посмотрите здесь Metadata/Driver/XmlDriver.php   -  person Yulio Aleman Jimenez    schedule 15.02.2018
comment
@YulioAlemanJimenez, спасибо за ваш комментарий. Я предполагаю, что свойство inline касается не форматирования, а структуры: оно помещает элемент в корень.   -  person sevavietl    schedule 15.02.2018


Ответы (1)


Через некоторое время я нашел решение, не уверен, что оно правильное, но оно помогает.

XmlSerializationVisitor имеет открытый метод setFormatOutput и $formatOutput по умолчанию true.

SerializerBuilder устанавливает посетителей по умолчанию, поэтому $formatOutput посетителя сериализатора XML по умолчанию также имеет значение true по умолчанию:

Мы можем установить наших собственных посетителей сериализатора, используя setSerializationVisitor. Интересно, что если мы используем этот метод, никакие другие посетители по умолчанию не будут установлены (включая посетителя десериализации). Поэтому, если вам нужно установить один не по умолчанию, вы должны установить все.

Имея в виду написанное выше, мы можем настроить наш сериализатор для сериализации и десериализации XML следующим образом:

use JMS\Serializer\SerializerBuilder;
use JMS\Serializer\Naming\CamelCaseNamingStrategy;
use JMS\Serializer\Naming\SerializedNameAnnotationStrategy;
use JMS\Serializer\Accessor\DefaultAccessorStrategy;
use JMS\Serializer\XmlSerializationVisitor;
use JMS\Serializer\XmlDeserializationVisitor;

$serializerBuilder = SerializerBuilder::create();

$propertyNamingStrategy = new SerializedNameAnnotationStrategy(new CamelCaseNamingStrategy());
$accessorStrategy = new DefaultAccessorStrategy();
$serializationVisitor = new XmlSerializationVisitor($propertyNamingStrategy, $accessorStrategy);
$serializationVisitor->setFormatOutput(false); // <= So this is what all the fuss is about.
$deserializationVisitor = new XmlDeserializationVisitor($propertyNamingStrategy);

$serializerBuilder->setSerializationVisitor('xml', $serializationVisitor);
$serializerBuilder->setDeserializationVisitor('xml', $deserializationVisitor);

$this->serializer = $serializerBuilder->build();
person sevavietl    schedule 15.02.2018