Magento 2.2.1 No se puede serializar el valor

12

He actualizado el sitio web de 2.1.6 a 2.2.1 y no puedo serializar el error de valor en el front-end y el back-end.

{"0":"Unable to serialize value.","1":"#0 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/Translate.php(494): Magento\\Framework\\Serialize\\Serializer\\Json->serialize(Array)\n
#1 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/Translate.php(190): Magento\\Framework\\Translate->_saveCache()\n
#2 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/App\/Area.php(244): Magento\\Framework\\Translate->loadData(NULL, false)\n
#3 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/App\/Area.php(215): Magento\\Framework\\App\\Area->_initTranslate()\n
#4 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/App\/Area.php(142): Magento\\Framework\\App\\Area->_loadPart('translate')\n
#5 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/View\/DesignLoader.php(55): Magento\\Framework\\App\\Area->load('translate')\n
#6 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/App\/Action\/Plugin\/Design.php(48): Magento\\Framework\\View\\DesignLoader->load()\n
#7 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/Interception\/Interceptor.php(121): Magento\\Framework\\App\\Action\\Plugin\\Design->beforeDispatch(Object(Magento\\Cms\\Controller\\Index\\Index\\Interceptor), Object(Magento\\Framework\\App\\Request\\Http))\n
#8 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/Interception\/Interceptor.php(153): Magento\\Cms\\Controller\\Index\\Index\\Interceptor->Magento\\Framework\\Interception\\{closure}(Object(Magento\\Framework\\App\\Request\\Http))\n
#9 \/var\/www\/vhosts\/demo.com\/eiselec\/generated\/code\/Magento\/Cms\/Controller\/Index\/Index\/Interceptor.php(39): Magento\\Cms\\Controller\\Index\\Index\\Interceptor->___callPlugins('dispatch', Array, Array)\n
#10 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/App\/FrontController.php(55): Magento\\Cms\\Controller\\Index\\Index\\Interceptor->dispatch(Object(Magento\\Framework\\App\\Request\\Http))\n
#11 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/Interception\/Interceptor.php(58): Magento\\Framework\\App\\FrontController->dispatch(Object(Magento\\Framework\\App\\Request\\Http))\n
#12 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/Interception\/Interceptor.php(138): Magento\\Framework\\App\\FrontController\\Interceptor->___callParent('dispatch', Array)\n
#13 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/module-store\/App\/FrontController\/Plugin\/RequestPreprocessor.php(94): Magento\\Framework\\App\\FrontController\\Interceptor->Magento\\Framework\\Interception\\{closure}(Object(Magento\\Framework\\App\\Request\\Http))\n
#14 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/Interception\/Interceptor.php(135): Magento\\Store\\App\\FrontController\\Plugin\\RequestPreprocessor->aroundDispatch(Object(Magento\\Framework\\App\\FrontController\\Interceptor), Object(Closure), Object(Magento\\Framework\\App\\Request\\Http))\n
#15 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/module-page-cache\/Model\/App\/FrontController\/BuiltinPlugin.php(73): Magento\\Framework\\App\\FrontController\\Interceptor->Magento\\Framework\\Interception\\{closure}(Object(Magento\\Framework\\App\\Request\\Http))\n
#16 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/Interception\/Interceptor.php(135): Magento\\PageCache\\Model\\App\\FrontController\\BuiltinPlugin->aroundDispatch(Object(Magento\\Framework\\App\\FrontController\\Interceptor), Object(Closure), Object(Magento\\Framework\\App\\Request\\Http))\n
#17 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/Interception\/Interceptor.php(153): Magento\\Framework\\App\\FrontController\\Interceptor->Magento\\Framework\\Interception\\{closure}(Object(Magento\\Framework\\App\\Request\\Http))\n
#18 \/var\/www\/vhosts\/demo.com\/eiselec\/generated\/code\/Magento\/Framework\/App\/FrontController\/Interceptor.php(26): Magento\\Framework\\App\\FrontController\\Interceptor->___callPlugins('dispatch', Array, NULL)\n
#19 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/App\/Http.php(135): Magento\\Framework\\App\\FrontController\\Interceptor->dispatch(Object(Magento\\Framework\\App\\Request\\Http))\n
#20 \/var\/www\/vhosts\/demo.com\/eiselec\/vendor\/magento\/framework\/App\/Bootstrap.php(256): Magento\\Framework\\App\\Http->launch()\n
#21 \/var\/www\/vhosts\/demo.com\/eiselec\/index.php(39): Magento\\Framework\\App\\Bootstrap->run(Object(Magento\\Framework\\App\\Http))\n
#22 {main}","url":"\/","script_name":"\/index.php"}

Déjame saber cómo puedo resolverlo.

Gracias

Meetanshi
fuente
Hola, estoy hablando del valor de serialización, no del valor de no serialización.
Meetanshi el
¿Has intentado borrar el caché? no solo caché de Magento, también cachés externos, si los hay.
MGento
Sí, lo he intentado.
Meetanshi el
¿Puedes intentar averiguar qué datos estás tratando de serializar? Intente atravesar los módulos de terceros y descubra desde qué módulo se activa este error. Probablemente deba anular la función de serialización, en el archivo /vendor/magento/framework/Serialize/Serializer/Json.php
MGento
¿Se produce este error durante la actualización de la base de datos o después de haber actualizado la base de datos a 2.2.1?
drew7721

Respuestas:

4

Tengo el mismo comportamiento con una plantilla. Copié el código del error en mi serializador para obtener mi problema.

Tan pronto como cambie a de_DE y regenere mi código estático a través de

sudo php bin/magento setup:static-content:deploy de_DE --jobs=0 -f

arroja "caracteres UTF-8 con formato incorrecto, posiblemente codificados incorrectamente".

Así que busqué los archivos que cambié en la carpeta de plantillas (es decir, código / Mytheme / Bannerslider / i18n / de_DE.csv) y los descargué a través de WinSCP. Notepad ++ mostró "Codificación de Ansii", aunque usé "magento i18n: collect-frases" para crear el archivo de traducción.

magento2dev # encguess app/code/MyTheme/Bannerslider/i18n/de_DE.csv

app / code / MyTheme / Bannerslider / i18n / de_DE.csv US-ASCII

magento2dev # locale
LANG=de_DE.UTF-8
......

Así que cambié los archivos manualmente en Notepad ++, los cargué, implementé el contenido estático y restablecí todos los permisos, en realidad funciona.

Entonces, el error podría estar en su archivo csv i18n.

Lord_Pinhead
fuente
10

Como puedo ver, este error proviene del método:

/**
 * Saving data cache
 *
 * @return $this
 */
protected function _saveCache()
{
    $this->_cache->save($this->getSerializer()->serialize($this->getData()), $this->getCacheId(true), [], false);
    return $this;
}

y el serializador que no se encuentra proviene del método:

/**
 * Get serializer
 *
 * @return \Magento\Framework\Serialize\SerializerInterface
 * @deprecated 100.2.0
 */
private function getSerializer()
{
    if ($this->serializer === null) {
        $this->serializer = \Magento\Framework\App\ObjectManager::getInstance()
            ->get(Serialize\SerializerInterface::class);
    }
    return $this->serializer;
}

La preferencia por el SerializerInterfacese agregó desde la versión 2.2.x del Magento, y se declaró en la aplicación / etc / di.xml :

<preference for="Magento\Framework\Serialize\SerializerInterface" type="Magento\Framework\Serialize\Serializer\Json" />

Así que creo que su caché es vieja o la preferencia por el SerializerInterfaceno funciona. Intente depurar este problema llamando al Magento\Framework\Serialize\SerializerInterface(usando inyección de dependencia) en algún lugar del código, y verifique qué clase devuelve di:

public function __construct(\Magento\Framework\Serialize\SerializerInterface $serializer) 
{ 
    echo get_class($serializer);
}

Si no devuelve una instancia de la Magento\Framework\Serialize\Serializer\Jsonclase devuelta, intente buscar esta preferencia sobrescrita en el proyecto y elimínela.

Si está trabajando en el servidor remoto, primero verifique el app/etc/di.xmlarchivo en el servidor directamente.

Otra forma en que puede modificar temporalmente el Jsonserializador central y verificar qué error regresó:

Abra magento/framework/Serialize/Serializer/Json.phpy cambie este método de:

/**
 * {@inheritDoc}
 * @since 100.2.0
 */
public function serialize($data)
{
    $result = json_encode($data);
    if (false === $result) {
        throw new \InvalidArgumentException('Unable to serialize value.');
    }
    return $result;
}

a:

/**
 * {@inheritDoc}
 * @since 100.2.0
 */
public function serialize($data)
{
    $result = json_encode($data);
    if (false === $result) {
        switch (json_last_error()) {
            case JSON_ERROR_NONE:
                $error = ' - No errors';
                break;
            case JSON_ERROR_DEPTH:
                $error = ' - Maximum stack depth exceeded';
                break;
            case JSON_ERROR_STATE_MISMATCH:
                $error = ' - Underflow or the modes mismatch';
                break;
            case JSON_ERROR_CTRL_CHAR:
                $error = ' - Unexpected control character found';
                break;
            case JSON_ERROR_SYNTAX:
                $error = ' - Syntax error, malformed JSON';
                break;
            case JSON_ERROR_UTF8:
                $error = ' - Malformed UTF-8 characters, possibly incorrectly encoded';
                break;
            default:
                $error = ' - Unknown error';
                break;
        }
        throw new \InvalidArgumentException('Unable to serialize value. Error: ' . $error);
    }

    return $result;
}

Luego puede ver después del mensaje de excepción un error json. Puede ser que sus datos estén rotos. tenga en cuenta que todos los datos antiguos no deben ser serializados y serializados utilizando json en los scripts de actualización de la configuración durante la actualización de magento.

PD: ¡ no te olvides de revertir los archivos principales después de completar la depuración! La mejor manera es usar xDebug para ese propósito.

Siarhey Uchukhlebau
fuente
2
Debería hacer de ese asistente de depuración un parche central, o sugerir que usen PHP SEGURO github.com/thecodingmachine/safe
Alex
2

En mi caso, la causa de un problema de codificación UTF8 fue el acortamiento seguro no multibyte de los nombres de productos:

$productName = strlen($productName) > 60 ? substr($productName,0,60)."..." : 
      $productName;

Entonces un

012345678901234567890123456789012345678901234567890123456 Außengewinde 

convirtió

012345678901234567890123456789012345678901234567890123456 Au�...
Alex
fuente
Este fue también el problema para nuestro. lo solucioné reemplazando "substr" por "mb_substr"
amesh
¡¡¡Funciona de maravilla!!!
Bharat Sevra
2

Tenga cuidado con la función substr. No es compatible con UTF-8. Y esto puede romper el FPC. Use mb_substr

Arni
fuente
1

Me encontré con el mismo problema con la actualización a 2.2.1. Este articulo me pareció muy útil http://devdocs.magento.com/guides/v2.2/ext-best-practices/tutorials/serialized-to-json-data-upgrade.html

Los datos almacenados en la base de datos ya no se deben serializar, ahora se deben guardar como un objeto JSON.

La mayoría de los módulos realizan una actualización de datos que deserializa los datos en la base de datos y los almacena nuevamente en formato JSON. (Por cierto, tomó bastante tiempo ejecutar esto ...)

Por lo tanto, si uno de sus módulos guarda datos que se serializan en la base de datos que Magento ya no podrá leer, deberá hacer un archivo de configuración de actualización de datos. Además, podría ser un módulo de terceros que debe actualizarse a una versión compatible con 2.2+.

Si serializa datos sin serializar en cualquier parte de su código, es posible que también tenga que cambiar eso.

Espero que esto le dé una mejor idea de lo que está causando este error.

¡Salud!

drew7721
fuente
Asegúrese de leer las Notas de la versión 2.2.1, los lotes han cambiado, incluida la ruta de la generationcarpeta. ;)
drew7721
1

Terminé exactamente a la misma situación. Después de agregar el código anterior, obtuve "caracteres UTF-8 mal formados, posiblemente codificados incorrectamente"

Supongo que no estás usando el idioma predeterminado. Intente cambiar el idioma a "predeterminado" en_US.

Meetanshi: ¿qué idioma está utilizando en el front-end y está fallando la creación de contenido estático?

AP
fuente
Hola @AP, estoy enfrentando el mismo error y estoy usando el lenguaje de_DE.
Meetanshi
Intenta cambiar a en_US. Tabla core_config_data (general / locale / code) a en_US
AP
mismo error después de cambiar a en_US.
Meetanshi
Me las arreglé para levantarlo, pero fue un callejón sin salida al intentar volver a fi_FI. ¿Despejaste el caché?
AP
sí,
borré el
0

Para mí, la solución fue reemplazar todos los caracteres especiales como "ä" en el archivo csv de traducción con versiones html del mismo carácter como este:

&auml;

Luego borré los cachés y volví a cargar la interfaz.

Webninja
fuente