Magento 2.2.1 Nie można serializować wartości


12

Zaktualizowałem witrynę z wersji 2.1.6 do wersji 2.2.1 i mam problem z niemożnością serializacji błędu wartości w interfejsie użytkownika.

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

Daj mi znać, jak mogę to rozwiązać.

Dzięki


Cześć, mówię o wartości serializacji, a nie o wartości zerowej.
Meetanshi,

Czy próbowałeś wyczyścić pamięć podręczną? nie tylko pamięć podręczna Magento, ale także zewnętrzne pamięci podręczne.
MGento

tak, próbowałem.
Meetanshi,

Czy możesz spróbować dowiedzieć się, jakie dane próbujesz serializować? Spróbuj przejść przez moduły innych firm i dowiedzieć się, z którego modułu ten błąd jest wyzwalany. Prawdopodobnie konieczne może być zastąpienie funkcji serializacji w pliku /vendor/magento/framework/Serialize/Serializer/Json.php
MGento

Czy ten błąd występuje podczas aktualizacji DB lub po zaktualizowaniu DB do 2.2.1?
drew7721,

Odpowiedzi:


4

Mam takie samo zachowanie z szablonem. Skopiowałem kod błędu do mojego serializatora, aby uzyskać problem.

Jak tylko przejdę na de_DE i ponownie wygeneruję mój kod statyczny poprzez

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

wyrzuca „Zniekształcone znaki UTF-8, być może niepoprawnie zakodowane”.

Poszukałem więc plików, które zmieniłem w folderze szablonów (tj. Code / Mytheme / Bannerslider / i18n / de_DE.csv) i pobrałem je przez WinSCP. Notepad ++ pokazał „Kodowanie Ansii” - ciężko użyłem „magento i18n: zbierać frazy” do utworzenia pliku tłumaczenia.

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

Więc ręcznie zmieniłem pliki w Notepad ++, załadowałem je, wdrożyłem zawartość statyczną i zresetowałem wszystkie uprawnienia - en voila to działa.

Tak więc błąd może znajdować się w pliku csv i18n.


10

Jak widzę ten błąd pochodzi z metody:

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

a serializator, który nie został znaleziony, pochodzi z metody:

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

Preferencje SerializerInterfacezostały dodane od wersji Magento 2.2.xi zadeklarowane w aplikacji / etc / di.xml :

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

Więc myślę, że twoja pamięć podręczna jest stara lub preferencja SerializerInterfacenie działa. Spróbuj debugować ten problem, wywołując Magento\Framework\Serialize\SerializerInterface(przy użyciu wstrzykiwania zależności) gdzieś w kodzie i sprawdź, która klasa zwróciła di:

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

Jeśli nie zwraca instancji Magento\Framework\Serialize\Serializer\Jsonklasy, spróbuj wyszukać tę nadpisaną preferencję w projekcie i usuń ją.

Jeśli pracujesz na zdalnym serwerze - najpierw sprawdź app/etc/di.xmlplik na serwerze bezpośrednio.

Innym sposobem na tymczasowe zmodyfikowanie podstawowego Jsonserializatora i sprawdzenie, który błąd zwrócił:

Otwórz magento/framework/Serialize/Serializer/Json.phpi zmień tę metodę z:

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

do:

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

Następnie po komunikacie wyjątku zobaczysz błąd JSON. Być może Twoje dane są uszkodzone. pamiętaj, że wszystkie stare dane powinny być niezserializowane i zserializowane przy użyciu json w skryptach aktualizacji instalatora podczas aktualizacji Magento.

PS: nie zapomnij przywrócić podstawowych plików po zakończeniu debugowania! Lepszym sposobem jest użycie do tego celu xDebug.


2
Powinieneś uczynić tego pomocnika debuggera główną poprawką - lub zasugerować, aby używał BEZPIECZNEGO PHP github.com/thecodingmachine/safe
Alex

2

W moim przypadku przyczyną problemu z kodowaniem UTF8 było skrócenie nazw produktów, które nie są wielobajtowe:

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

Więc

012345678901234567890123456789012345678901234567890123456 Außengewinde 

stał się

012345678901234567890123456789012345678901234567890123456 Au�...

To był również problem dla naszych. ixed to, zastępując „substr” słowem „mb_substr”
amesh

Działa jak marzenie!!!
Bharat Sevra

2

Uważaj na funkcję substr. Nie obsługuje UTF-8. A to może złamać FPC. Użyj mb_substr


1

Wystąpił ten sam problem z aktualizacją do wersji 2.2.1. Uważam, że ten artykuł jest bardzo pomocny http://devdocs.magento.com/guides/v2.2/ext-best-practices/tutorials/serialized-to-json-data-upgrade.html

Dane przechowywane w bazie danych nie powinny być już serializowane, należy je teraz zapisać jako obiekt JSON.

Większość modułów dokonuje aktualizacji danych, która odserializuje dane w bazie danych i przechowuje je ponownie w formacie JSON. (BTW Uruchomienie tego zajęło sporo czasu ...)

Dlatego jeśli jeden z Twoich modułów zapisuje dane, które są serializowane w DB, że dane mogą nie być odczytywane przez Magento, będziesz musiał utworzyć plik instalacyjny aktualizacji danych. Może to być także moduł innej firmy, który wymaga aktualizacji do wersji zgodnej z wersją 2.2+.

Jeśli serializujesz dane, które nie są serializowane, w dowolnym miejscu w kodzie, być może będziesz musiał to zmienić.

Mam nadzieję, że daje to lepszy wgląd w przyczyny tego błędu.

Twoje zdrowie!


Przeczytaj Informacje o wersji 2.2.1, wiele się zmieniło, w tym ścieżka do generationfolderu. ;)
drew7721,

1

Skończyło się dokładnie na tej samej sytuacji. Po dodaniu powyższego kodu otrzymałem „Zniekształcone znaki UTF-8, być może niepoprawnie zakodowane”

Przypuszczam, że nie używasz domyślnego języka. Spróbuj zmienić język na „default” en_US.

Meetanshi - Jakiego języka używasz w interfejsie i czy tworzenie zawartości statycznej również nie działa?


Cześć @AP, mam ten sam błąd i używam języka de_DE.
Meetanshi,

Spróbuj zmienić na en_US. Tabela core_config_data (general / locale / code) do en_US
AP

ten sam błąd po zmianie na en_US.
Meetanshi,

Udało mi się to podnieść, ale ślepy zaułek, gdy próbowałem wrócić do fi_FI. Czy wyczyściłeś pamięć podręczną?
AP

tak, wyczyściłem pamięć podręczną
Meetanshi

0

Dla mnie rozwiązaniem było zastąpienie wszystkich znaków specjalnych, takich jak „ä” w pliku csv tłumaczenia, wersjami HTML tego samego znaku, jak poniżej:

&auml;

Potem wyczyściłem pamięć podręczną i ponownie załadowałem interfejs.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.