2025-04-14

Drupal的序列化和反序列化用的是 symfony/serializer

服务

$serializer = \Drupal::service("serializer");

 

Node序列化成xml.

$node = node_load(1);

$serializer = \Drupal::service("serializer");
$xml = $serializer->serialize($node, 'xml');

// 再解析回来
$deserializedData = $serializer->deserialize($xml, $node::class, 'xml');
dpm($deserializedData);

解析XML为数组

$data = <<<EOF
<?xml version="1.0"?>
<response><userid>1</userid><username>xiukunabcd</username></response>
EOF;

$serializer = \Drupal::service("serializer");
$deserializedData = $serializer->decode($data, 'xml');

dpm($deserializedData);

 

定义csv解析和反解析, 先定义一个服务:

services:
  mymodule.encoder.csv:
    class: Drupal\mymodule\Encoder\CsvEncoder
    tags:
      - { name: encoder, format: csv }

 

目录在src/Encoder/CsvEncoder.php

<?php
namespace Drupal\rest_output\Encoder;

class CsvEncoder extends \Symfony\Component\Serializer\Encoder\CsvEncoder {
  protected $format = 'csv';

  public function decode(string $data, string $format, array $context = []): mixed
  {
    $context[CsvEncoder::AS_COLLECTION_KEY] = false;
    return parent::decode($data, $format, $context); // TODO: Change the autogenerated stub
  }
}

 

测试

$node = node_load(1);

$serializer = \Drupal::service("serializer");
$xml = $serializer->serialize($node, 'csv');


$deserializedData = $serializer->deserialize($xml, $node::class, 'csv');
dpm($deserializedData);

在目录中vendor/symfony/serializer/Encoder还可能看到有yaml的解析。 可以使用上面代码复写

 

标签: Drupal