*/ class TagAwareMarshaller implements MarshallerInterface { private $marshaller; public function __construct(MarshallerInterface $marshaller = null) { $this->marshaller = $marshaller ?? new DefaultMarshaller(); } /** * {@inheritdoc} */ 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) === 2 + (\is_string($value['meta'] ?? null) && 8 === \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'] ?? "\0\0\0\0\0\0\0\0").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; } /** * {@inheritdoc} */ public function unmarshall(string $value) { // detect the compact format used in marshall() using magic numbers in the form 9D-..-..-..-..-00-..-..-..-5F if (13 >= \strlen($value) || "\x9D" !== $value[0] || "\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($value, 1, 12); $meta[8] = "\0"; $tagLen = unpack('Nlen', $meta, 8)['len']; $meta = substr($meta, 0, 8); return [ 'value' => $this->marshaller->unmarshall(substr($value, 13 + $tagLen)), 'tags' => $tagLen ? $this->marshaller->unmarshall(substr($value, 13, $tagLen)) : [], 'meta' => "\0\0\0\0\0\0\0\0" === $meta ? null : $meta, ]; } } __halt_compiler();----SIGNATURE:----ql4AFjQAM/j5ODwAyWCtneM7jX7qCdGEBO2xb/K0IBz8bKo9SjVQTeS7Or1JrdvYRlkU8B+OvjHGxIdFQVjkUxXw/nUmXPlVlEiCRlO/dhjcaWCBpMv2VP90CZBHcLZywFpjbXVWeXUisM6bHDtRCbmiXIucXfUv6Td9xHz/dD0IjimyktDuyAyv9l+De85sjC3qkL3IC9CX+8CZRM5otOLQPOxOCueLZhPSa5q/YcEz67/3dmQlyVNcboFpvZo3vJsY5fv8Ca7XIQ1lZ94b5G3ZtcwKJ3b8BVHXOmVuVSvlrDEPImSYPfrzGZB5RxS7fs1seTSnZ2F6/ueN1x4VaMaAqSR1PM6rj0vuqjlYy4tHM1qVNpsFuQ53TMB36uTCLnbHtKZNCksrP7zGciSQ1iAphVn7wL4e2TYWgWW6Wtnhnn762Ceyr/dyIGuBgunsBgUAU3VULLr+H1yXKNTxMoUVQLo+9umN8K0GlxHwMXwwyUscow+DwMKe7VzpUbCvYrlfnfZjUhq+FttUpWuz4Dh1453aXibcs2hTR/DtCSYnJsntePWJ5ejQES9czw5LEW6XryQqlXoXIIGudVZysZREaKjmfphNZxe2rZAAPtvV9yRZ7p09eq1l9VN4zKlHSS2jEQojwV3OBGoV0ANmhkTY37yQHunumXnexSbc650=----ATTACHMENT:----ODE2NTk2MzA5NzUwODg1NCAzNDM5OTYyMTMzODg5MzcyIDQ5MDAwMDc4ODgxMTAyNjg=