Magento 2.2.1 Impossibile serializzare il valore


12

Ho aggiornato il sito Web da 2.1.6 a 2.2.1 e non riesco a serializzare l'errore di valore in frontend e backend.

{"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"}

Fammi sapere come posso risolverlo.

Grazie


Ciao, sto parlando di serializzare il valore e non di annullare il valore.
Meetanshi,

Hai provato a svuotare la cache? non solo cache Magento, anche cache esterne se presenti.
MGento,

si, ci ho provato.
Meetanshi,

Puoi provare a scoprire quali dati stai cercando di serializzare? Prova a spostarti tra i moduli di terze parti e scopri da quale modulo viene generato questo errore. Probabilmente potresti aver bisogno di sovrascrivere la funzione serialize, nel file /vendor/magento/framework/Serialize/Serializer/Json.php
MGento

Questo errore si verifica durante l'aggiornamento del DB o dopo aver aggiornato il DB a 2.2.1?
Drew7721,

Risposte:


4

ho lo stesso comportamento con un modello. Ho copiato il codice per l'errore sul mio serializzatore per ottenere il mio problema.

Non appena passo a de_DE e rigenero il mio codice statico tramite

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

genera "caratteri UTF-8 non validi, eventualmente codificati in modo errato".

Quindi ho cercato i file che ho cambiato nella cartella dei template (cioè code / Mytheme / Bannerslider / i18n / de_DE.csv) e li ho scaricati tramite WinSCP. Notepad ++ mostrava "Ansii Encoding" - per cui ho usato "magento i18n: collect-frasi" per creare il file di traduzione.

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

Quindi ho modificato manualmente i file in Notepad ++, li ho caricati, distribuito il contenuto statico e ripristinato tutte le autorizzazioni - nel frattempo funziona.

Quindi, il bug potrebbe essere nel tuo file CSV i18n.


10

Come posso vedere, questo errore deriva dal metodo:

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

e il serializzatore che non viene trovato proviene dal metodo:

/**
 * 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 preferenza per è SerializerInterfacestata aggiunta dalla versione 2.2.x di Magento e dichiarata nell'app / etc / di.xml :

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

Quindi penso che la tua cache sia vecchia o che la preferenza per SerializerInterfacenon funzioni. Prova a eseguire il debug di questo problema chiamando il Magento\Framework\Serialize\SerializerInterfacecodice (usando l'iniezione di dipendenza) da qualche parte nel codice e controlla quale classe restituita da di:

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

Se non restituisce un'istanza della Magento\Framework\Serialize\Serializer\Jsonclasse restituita, prova a cercare questa preferenza sovrascritta nel progetto e rimuoverla.

Se stai lavorando sul server remoto, controlla innanzitutto il app/etc/di.xmlfile direttamente sul server.

Un altro modo è possibile modificare temporaneamente il Jsonserializzatore principale e verificare quale errore ha restituito:

Apri il magento/framework/Serialize/Serializer/Json.phpe modifica questo metodo da:

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

per:

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

Quindi puoi vedere dopo il messaggio di eccezione un errore json. Forse i tuoi dati sono rotti. tenere presente che tutti i vecchi dati devono essere non serializzati e serializzati utilizzando json negli script di aggiornamento dell'installazione durante l'aggiornamento di Magento.

PS: non dimenticare di ripristinare i file core dopo aver completato il debug! Il modo migliore è usare xDebug a tale scopo.


2
Dovresti rendere quel debugger-helper una patch di base - o suggerire che utilizzino SAFE PHP github.com/thecodingmachine/safe
Alex

2

Nel mio caso la causa di un problema di codifica UTF8 è stata l'accorciamento sicuro non multibyte dei nomi di prodotti:

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

Quindi a

012345678901234567890123456789012345678901234567890123456 Außengewinde 

divenne

012345678901234567890123456789012345678901234567890123456 Au�...

Questo è stato anche il problema per il nostro. risolto sostituendo "substr" con "mb_substr"
amesh,

Funziona come un fascino !!!
Bharat Sevra,

2

Fare attenzione con la funzione substr. Non supporta UTF-8. E questo può interrompere l'FPC. Usa mb_substr


1

Ho riscontrato lo stesso problema con l'aggiornamento a 2.2.1. Ho trovato questo articolo molto utile http://devdocs.magento.com/guides/v2.2/ext-best-practices/tutorials/serialized-to-json-data-upgrade.html

I dati memorizzati nel DB non dovrebbero più essere serializzati, ora dovrebbero essere salvati come oggetto JSON.

La maggior parte dei moduli effettua un aggiornamento dei dati che non serializza i dati nel DB e li memorizza nuovamente in un formato JSON. (A proposito ci è voluto un po 'di tempo per eseguire questo ...)

Pertanto, se uno dei tuoi moduli salva i dati serializzati nel DB, tali dati potrebbero non essere più leggibili da Magento, dovrai creare un file di installazione per l'aggiornamento dei dati. Inoltre, potrebbe essere un modulo di terze parti che deve essere aggiornato a una versione compatibile 2.2+.

Se si serializzano dati non serializzati in qualsiasi punto del codice, è possibile che sia necessario modificarli.

Spero che questo ti dia una visione migliore di ciò che sta causando questo errore.

Saluti!


Assicurati di leggere le Note di rilascio per 2.2.1, i lotti sono cambiati, incluso il percorso della generationcartella. ;)
disegnato il

1

Sono finito esattamente nella stessa situazione. Dopo aver aggiunto il codice sopra ho ottenuto "Caratteri UTF-8 non validi, eventualmente codificati in modo errato"

Suppongo che tu non stia usando la lingua predefinita. Prova a cambiare la lingua in "default" en_US.

Meetanshi: quale lingua stai utilizzando in front-end e anche la creazione di contenuti statici non riesce?


Ciao @AP, sto riscontrando lo stesso errore e sto usando il linguaggio de_DE.
Meetanshi,

Prova a passare a en_US. Tabella core_config_data (generale / locale / codice) in en_US
AP

stesso errore dopo la modifica in en_US.
Meetanshi,

Sono riuscito a risollevarlo, ma in un vicolo cieco quando tento di tornare a fi_FI. Hai cancellato la cache?
AP,

sì, ho cancellato la cache
Meetanshi il

0

Per me la soluzione è stata quella di sostituire tutti i caratteri speciali come "ä" nel file csv di traduzione con versioni html dello stesso carattere come questo:

&auml;

Poi ho cancellato le cache e ricaricato il frontend.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.