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.