Вход Регистрация
Файл: vendor/symfony/cache/Marshaller/TagAwareMarshaller.php
Строк: 72
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyComponentCacheMarshaller;

/**
 * A marshaller optimized for data structures generated by AbstractTagAwareAdapter.
 *
 * @author Nicolas Grekas <p@tchwork.com>
 */
class TagAwareMarshaller implements MarshallerInterface
{
    private 
MarshallerInterface $marshaller;

    public function 
__construct(?MarshallerInterface $marshaller null)
    {
        
$this->marshaller $marshaller ?? new DefaultMarshaller();
    }

    public function 
marshall(array $values, ?array &$failed): array
    {
        
$failed $notSerialized $serialized = [];

        foreach (
$values as $id => $value) {
            if (
is_array($value) && is_array($value['tags'] ?? null) && array_key_exists('value'$value) && count($value) === + (is_string($value['meta'] ?? null) && === strlen($value['meta']))) {
                
// if the value is an array with keys "tags", "value" and "meta", use a compact serialization format
                // magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F allow detecting this format quickly in unmarshall()

                
$v $this->marshaller->marshall($value$f);

                if (
$f) {
                    
$f = [];
                    
$failed[] = $id;
                } else {
                    if ([] === 
$value['tags']) {
                        
$v['tags'] = '';
                    }

                    
$serialized[$id] = "x9D".($value['meta'] ?? "").pack('N'strlen($v['tags'])).$v['tags'].$v['value'];
                    
$serialized[$id][9] = "x5F";
                }
            } else {
                
// other arbitrary values are serialized using the decorated marshaller below
                
$notSerialized[$id] = $value;
            }
        }

        if (
$notSerialized) {
            
$serialized += $this->marshaller->marshall($notSerialized$f);
            
$failed array_merge($failed$f);
        }

        return 
$serialized;
    }

    public function 
unmarshall(string $value): mixed
    
{
        
// detect the compact format used in marshall() using magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F
        
if (13 >= strlen($value) || "x9D" !== $value[0] || "" !== $value[5] || "x5F" !== $value[9]) {
            return 
$this->marshaller->unmarshall($value);
        }

        
// data consists of value, tags and metadata which we need to unpack
        
$meta substr($value112);
        
$meta[8] = "";
        
$tagLen unpack('Nlen'$meta8)['len'];
        
$meta substr($meta08);

        return [
            
'value' => $this->marshaller->unmarshall(substr($value13 $tagLen)),
            
'tags' => $tagLen $this->marshaller->unmarshall(substr($value13$tagLen)) : [],
            
'meta' => "" === $meta null $meta,
        ];
    }
}
Онлайн: 2
Реклама