Magento 2.2.1 Tidak dapat membuat cerita bersambung nilai


12

Saya telah memutakhirkan situs web dari 2.1.6 ke 2.2.1 dan menghadapi Tidak dapat membuat kesalahan nilai serialisasi di frontend dan 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"}

Biarkan saya tahu bagaimana saya bisa mengatasinya.

Terima kasih


Hai, saya berbicara tentang nilai serialisasi bukan nilai uneriaize.
Meetanshi

Sudahkah Anda mencoba membersihkan cache? tidak hanya cache Magento, cache eksternal juga jika ada.
MGento

ya, saya sudah mencoba.
Meetanshi

Bisakah Anda mencoba mencari tahu, data apa yang ingin Anda serialkan? Coba lewati modul pihak ketiga Anda dan cari tahu, dari modul mana, kesalahan ini dipicu. Anda mungkin perlu mengganti fungsi serialisasi, di file /vendor/magento/framework/Serialize/Serializer/Json.php
MGento

Apakah kesalahan ini terjadi selama pembaruan DB atau setelah Anda memperbarui DB ke 2.2.1?
drew7721

Jawaban:


4

saya memiliki perilaku yang sama dengan templat. Saya menyalin kode untuk kesalahan ke serializer saya untuk mendapatkan masalah saya.

Segera setelah saya beralih ke de_DE dan membuat ulang kode statis saya melalui

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

itu melempar "karakter UTF-8 cacat, mungkin disandikan salah".

Jadi saya mencari file yang saya ubah di folder template (yaitu kode / Mytheme / Bannerslider / i18n / de_DE.csv) dan mengunduhnya melalui WinSCP. Notepad ++ menunjukkan "Ansii Encoding" - sulitnya saya menggunakan "magento i18n: collect-phrases" untuk membuat file terjemahan.

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

Jadi saya mengubah file secara manual di Notepad ++, mengunggahnya, menyebarkan konten statis dan mengatur ulang semua izin - dan voila berfungsi.

Jadi, bug tersebut mungkin ada di file csv i18n Anda.


10

Seperti yang saya lihat kesalahan ini berasal dari metode:

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

dan serializer yang tidak ditemukan berasal dari metode:

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

Preferensi untuk SerializerInterfaceditambahkan sejak versi 2.2.x dari Magento, dan dideklarasikan di app / etc / di.xml :

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

Jadi saya pikir cache Anda sudah tua atau preferensi untuk SerializerInterfacetidak berfungsi. Cobalah untuk men-debug masalah ini dengan memanggil Magento\Framework\Serialize\SerializerInterface(menggunakan injeksi ketergantungan) di suatu tempat dalam kode, dan memeriksa kelas mana yang dikembalikan oleh di:

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

Jika itu kembali bukan turunan dari Magento\Framework\Serialize\Serializer\Jsonkelas yang dikembalikan - coba cari preferensi yang ditimpa ini dalam proyek dan hapus.

Jika Anda bekerja pada server jarak jauh - periksa dulu app/etc/di.xmlfile di server secara langsung.

Cara lain Anda untuk sementara dapat memodifikasi Jsonserializer inti dan memeriksa kesalahan yang dikembalikan:

Buka magento/framework/Serialize/Serializer/Json.phpdan ubah metode ini dari:

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

untuk:

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

Maka Anda dapat melihat setelah pesan pengecualian kesalahan json. Mungkin data Anda rusak. perlu diingat bahwa semua data lama harus tidak di-serialisasi dan diserialisasi menggunakan json dalam skrip peningkatan pengaturan selama pembaruan magento.

PS: jangan lupa untuk mengembalikan kembali file inti setelah proses debug selesai! Cara yang lebih baik adalah menggunakan xDebug untuk tujuan itu.


2
Anda harus menjadikan debugger-helper patch inti - atau menyarankan mereka menggunakan SAFE PHP github.com/thecodingmachine/safe
Alex

2

Dalam kasus saya penyebab masalah Pengkodean UTF8, adalah pemendekan nama produk yang non-multibyte aman:

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

Jadi a

012345678901234567890123456789012345678901234567890123456 Außengewinde 

menjadi

012345678901234567890123456789012345678901234567890123456 Au�...

Ini juga masalah bagi kami. ixed itu dengan mengganti "substr" dengan "mb_substr"
amesh

Bekerja seperti pesona !!!
Bharat Sevra

2

Hati-hati dengan fungsi substr. Itu tidak mendukung UTF-8. Dan ini bisa merusak FPC. Gunakan mb_substr


1

Saya telah mengalami masalah yang sama dengan peningkatan ke 2.2.1. Saya menemukan artikel ini sangat membantu http://devdocs.magento.com/guides/v2.2/ext-best-practices/tutorials/serialized-to-json-data-upgrade.html

Data yang disimpan dalam DB tidak boleh diserialisasi lagi, sekarang harus disimpan sebagai objek JSON.

Sebagian besar modul membuat pembaruan data yang menguninstall data dalam DB dan menyimpannya kembali dalam format JSON. (BTW Butuh beberapa saat untuk menjalankan ini ...)

Oleh karena itu, jika salah satu modul Anda menyimpan data yang diserialisasi dalam DB bahwa data mungkin tidak dapat dibaca lagi oleh Magento, Anda perlu membuat file Pengaturan pemutakhiran data. Selain itu, mungkin modul pihak ke-3 yang perlu diperbarui ke versi yang kompatibel.

Jika Anda membuat serial pada data unserialize di mana saja dalam kode Anda, Anda mungkin harus mengubahnya juga.

Saya harap ini memberi Anda wawasan yang lebih baik tentang apa yang menyebabkan kesalahan ini.

Bersulang!


Pastikan untuk membaca Catatan Rilis untuk 2.2.1, banyak yang telah berubah, termasuk jalur untuk generationfolder. ;)
drew7721

1

Saya berakhir pada situasi yang sama persis. Setelah menambahkan kode di atas saya mendapat "Karakter UTF-8 cacat, mungkin disandikan salah"

Saya kira Anda tidak menggunakan bahasa default. Cobalah untuk mengubah bahasa menjadi "default" en_US.

Meetanshi - Bahasa apa yang Anda gunakan di front-end dan apakah pembuatan konten statis juga gagal?


Hai @ AP, saya menghadapi kesalahan yang sama dan saya menggunakan bahasa de_DE.
Meetanshi

Coba ubah ke en_US. Tabel core_config_data (umum / lokal / kode) ke en_US
AP

kesalahan yang sama setelah berubah menjadi en_US.
Meetanshi

Saya berhasil bangkit, tetapi buntu ketika mencoba kembali ke fi_FI. Apakah Anda sudah membersihkan cache?
AP

ya, saya membersihkan cache
Meetanshi

0

Bagi saya solusinya adalah mengganti semua karakter khusus seperti "ä" dalam file terjemahan csv dengan versi html dengan karakter yang sama seperti ini:

&auml;

Lalu aku membersihkan cache dan mengisi ulang frontend.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.