Magento 2.2.1 Não foi possível serializar o valor

12

Atualizei o site de 2.1.6 para 2.2.1 e não consigo serializar o erro de valor no front-end e no 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"}

Deixe-me saber como posso resolver isso.

obrigado

Meetanshi
fonte
Oi, eu estou falando sobre o valor de serializar valor não sereria.
Meetanshi
Você já tentou limpar o cache? não apenas cache do Magento, caches externos também, se houver.
MGento 21/11
sim, eu tentei.
Meetanshi
Você pode tentar descobrir quais dados você está tentando serializar? Tente percorrer seus módulos de terceiros e descubra, a partir de qual módulo, esse erro é acionado. Talvez você precise substituir a função serialize, no arquivo /vendor/magento/framework/Serialize/Serializer/Json.php
MGento
Esse erro está ocorrendo durante a atualização do banco de dados ou após a atualização do banco de dados para a 2.2.1?
drew7721

Respostas:

4

Eu tenho o mesmo comportamento com um modelo. Copiei o código do erro no meu serializador para obter meu problema.

Assim que eu mudar para de_DE e gerar novamente meu código estático via

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

ele lança "caracteres UTF-8 malformados, possivelmente codificados incorretamente".

Então, procurei os arquivos que alterei na pasta do modelo (ou seja, código / Mytheme / Bannerslider / i18n / de_DE.csv) e os baixei via WinSCP. O Notepad ++ mostrou "Ansii Encoding" - foi difícil usar "magento i18n: collect-phrases" para o arquivo de tradução criar.

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
......

Então, mudei os arquivos manualmente no Notepad ++, enviei-os, implantei o conteúdo estático e redefini todas as permissões - e pronto, ele funciona.

Portanto, o bug pode estar no seu arquivo i18n csv.

Lord_Pinhead
fonte
10

Como posso ver, esse erro vem do método:

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

O serializador não encontrado vem do 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;
}

A preferência pelo SerializerInterfacefoi adicionada desde a versão 2.2.x do Magento e declarada no aplicativo / etc / di.xml :

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

Acho que seu cache é antigo ou a preferência pelo cache SerializerInterfacenão está funcionando. Tente depurar esse problema chamando o Magento\Framework\Serialize\SerializerInterface(usando injeção de dependência) em algum lugar no código e verifique qual classe retornou por di:

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

Se ele não retornar uma instância da Magento\Framework\Serialize\Serializer\Jsonclasse retornada - tente pesquisar essa preferência substituída no projeto e remova-a.

Se você estiver trabalhando no servidor remoto - verifique primeiro o app/etc/di.xmlarquivo diretamente no servidor.

Outra maneira de modificar temporariamente o Jsonserializador principal e verificar qual erro retornou:

Abra o magento/framework/Serialize/Serializer/Json.phpe altere 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;
}

para:

/**
 * {@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;
}

Depois da mensagem de exceção, você poderá ver um erro json. Pode ser que seus dados estejam com problemas. lembre-se de que todos os dados antigos devem ser desserializados e serializados usando json nos scripts de atualização de instalação durante a atualização do magento.

PS: não se esqueça de reverter os arquivos principais após a depuração concluída! A melhor maneira é usar o xDebug para esse fim.

Siarhey Uchukhlebau
fonte
2
Você deve fazer essa depurador-helper um patch core - ou sugerir que eles usam SAFE PHP github.com/thecodingmachine/safe
Alex
2

No meu caso, a causa de um problema de codificação UTF8 foi o encurtamento não multibyte de nomes de produtos:

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

Então um

012345678901234567890123456789012345678901234567890123456 Außengewinde 

passou a ser

012345678901234567890123456789012345678901234567890123456 Au�...
Alex
fonte
Este também foi o problema para o nosso. ixed-lo substituindo "substr" com "mb_substr"
Amesh
Funciona como um encanto!!!
Bharat Sevra 25/02
2

Tenha cuidado com a função substr. Não suporta UTF-8. E isso pode quebrar o FPC. Use mb_substr

Arni
fonte
1

Eu corri no mesmo problema com a atualização para 2.2.1. Achei este artigo muito útil http://devdocs.magento.com/guides/v2.2/ext-best-practices/tutorials/serialized-to-json-data-upgrade.html

Os dados armazenados no banco de dados não devem mais ser serializados, agora devem ser salvos como um objeto JSON.

A maioria dos módulos faz uma atualização de dados que desserializa os dados no banco de dados e os armazena novamente em um formato JSON. (BTW Demorou um tempo para executar isso ...)

Portanto, se um dos seus módulos salvar dados serializados no banco de dados, que talvez não sejam mais legíveis pelo Magento, você precisará fazer um arquivo de instalação de atualização de dados. Além disso, pode ser um módulo de terceiros que precise ser atualizado para uma versão compatível com 2.2+.

Se você serializar dados não serializados em qualquer lugar do seu código, poderá ser necessário alterá-lo também.

Espero que isso lhe dê uma visão melhor do que está causando esse erro.

Felicidades!

drew7721
fonte
Certifique-se de ler as Notas da versão para 2.2.1, os lotes foram alterados, incluindo o caminho da generationpasta. ;)
drew7721
1

Acabei exatamente na mesma situação. Depois de adicionar o código acima, obtive "caracteres UTF-8 malformados, possivelmente codificados incorretamente"

Suponho que você não esteja usando o idioma padrão. Tente alterar o idioma para "padrão" en_US.

Meetanshi - Qual idioma você está usando no front-end e a criação de conteúdo estático também está falhando?

AP
fonte
Oi @AP, Estou enfrentando o mesmo erro e estou usando a linguagem de_DE.
Meetanshi
Tente alterar para en_US. Tabela core_config_data (general / locale / code) para en_US
AP
mesmo erro depois de mudar para en_US.
precisa saber é o seguinte
Consegui levantar, mas sem saída ao tentar voltar para fi_FI. Você limpou o cache?
AP
Sim, limpei o cache
Meetanshi 3/17/17
0

Para mim, a solução foi substituir todos os caracteres especiais como "ä" no arquivo csv de tradução por versões html do mesmo caractere:

&auml;

Depois limpei os caches e recarreguei o frontend.

Webninja
fonte