【问题标题】:Serialize to XML without formatting (tabs) using JMS Serializer使用 JMS 序列化器序列化为 XML 而不格式化(制表符)
【发布时间】:2018-07-26 06:19:23
【问题描述】:

我正在使用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);

提前谢谢你。

【问题讨论】:

标签: php xml serialization jms-serializer


【解决方案1】:

过了一会儿,我找到了解决方案,不确定它是否正确,但它确实可以解决问题。

XmlSerializationVisitor 有公共方法setFormatOutput$formatOutput 默认为true

SerializerBuilder默认设置访问者,所以默认XML序列化访问者的$formatOutput也默认为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();

【讨论】:

    猜你喜欢
    • 2016-03-02
    • 1970-01-01
    • 2020-02-15
    • 2016-07-25
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    相关资源
    最近更新 更多