Magento 2.2.1値をシリアル化できません


12

ウェブサイトを2.1.6から2.2.1にアップグレードし、フロントエンドとバックエンドで値のエラーをシリアル化できませんでした。

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

解決方法を教えてください。

ありがとう


こんにちは、値をシリアル化するのではなく、値をシリアル化することについて話しています。
Meetanshi 2017年

キャッシュをクリアしてみましたか?Magentoキャッシュだけでなく、外部キャッシュもあります。
MGento 2017年

はい、試しました。
Meetanshi 2017年

シリアル化しようとしているデータを見つけてください。サードパーティのモジュールをトラバースして、どのモジュールからこのエラーがトリガーされているかを確認してください。/vendor/magento/framework/Serialize/Serializer/Json.php
MGento

このエラーは、DBの更新中、またはDBを2.2.1に更新した後に発生しますか?
drew7721

回答:


4

テンプレートで同じ動作をします。エラーのコードをシリアライザにコピーして問題を解決しました。

de_DEに切り替えて静的コードを再生成するとすぐに

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

「不正なUTF-8文字、おそらく正しくエンコードされていない」をスローします。

そこで、テンプレートフォルダーで変更したファイル(つまり、code / Mytheme / Bannerslider / i18n / de_DE.csv)を探し、WinSCP経由でダウンロードしました。Notepad ++は「Ansii Encoding」を示しました-翻訳ファイルを作成するために「magento i18n:collect-phrases」を使用しました。

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

したがって、私はNotepad ++でファイルを手動で変更し、それらをアップロードし、静的コンテンツを展開し、すべての権限をリセットしました-動作します。

そのため、バグはi18n csvファイルにある可能性があります。


10

私が見ることができるように、このエラーはメソッドに起因します:

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

見つからないシリアライザはメソッドから来ます:

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

の設定はSerializerInterface2.2.xバージョンのMagento以降に追加され、app / etc / di.xmlで宣言されています。

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

だから私はあなたのキャッシュが古いか、の設定が機能してSerializerInterfaceいないと思います。Magento\Framework\Serialize\SerializerInterfaceコードの(依存関係注入を使用して)somを呼び出してこの問題をデバッグし、diによって返されるクラスを確認します。

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

返されたMagento\Framework\Serialize\Serializer\Jsonクラスのインスタンスが返されない場合 は、プロジェクトでこの上書きされた設定を検索して削除してください。

リモートサーバーで作業している場合-まずapp/etc/di.xml、サーバー上のファイルを直接確認します。

コアシリアライザーを一時的に変更して、Json返されたエラーを確認する別の方法:

を開き、magento/framework/Serialize/Serializer/Json.phpこのメソッドを次のように変更します。

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

に:

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

次に、例外メッセージの後にjsonエラーが表示されます。データが壊れている可能性があります。すべての古いデータは、magentoの更新中にセットアップアップグレードスクリプトでjsonを使用してシリアル化解除およびシリアル化する必要があることに注意してください。

PS:デバッグが完了したら、コアファイルを元に戻すことを忘れないでください!より良い方法は、そのためにxDebugを使用することです。


2
そのデバッガーヘルパーをコアパッチ
Alex

2

私の場合、UTF8エンコーディングの問題の原因は、マルチバイトではない安全な製品名の短縮でした。

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

だから

012345678901234567890123456789012345678901234567890123456 Außengewinde 

なりました

012345678901234567890123456789012345678901234567890123456 Au�...

これも私たちの問題でした。「substr」を「mb_substr」に置き換えることでそれを修正
amesh

魅力のように動作します!!!
Bharat

1

2.2.1へのアップグレードで同じ問題が発生しました。この記事が非常に役立つことがわかりました http://devdocs.magento.com/guides/v2.2/ext-best-practices/tutorials/serialized-to-json-data-upgrade.html

DBに保存されたデータはシリアル化されなくなり、JSONオブジェクトとして保存されるようになりました。

ほとんどのモジュールは、DB内のデータをシリアル化解除し、JSON形式で再度格納するデータ更新を行います。(ところでこれを実行するにはかなり時間がかかりました...)

したがって、モジュールの1つがDBにシリアル化されたデータを保存すると、そのデータはMagentoで読み取れなくなる可能性があるため、データアップグレードのセットアップファイルを作成する必要があります。また、それは、2.2 +互換バージョンに更新する必要があるサードパーティのモジュールである可能性があります。

コードの任意の場所でデータのシリアル化解除をシリアル化する場合は、それも変更する必要がある場合があります。

これにより、このエラーの原因をよりよく理解できると思います。

乾杯!


2.2.1のリリースノートを必ずお読みgenerationください。フォルダのパスを含め、多くの点が変更されています。;)
drew7721 2017年

1

私はまったく同じ状況になってしまいました。上記のコードを追加した後、「不正なUTF-8文字、おそらく正しくエンコードされていない」を取得しました

デフォルトの言語を使用していないと思います。言語を「デフォルト」のen_USに変更してみてください。

Meetanshi-フロントエンドで使用している言語と静的コンテンツの作成も失敗していますか?


こんにちは@AP、私は同じエラーに直面しており、de_DE言語を使用しています。
Meetanshi 2017

en_USに変更してみてください。テーブルcore_config_data(一般/ロケール/コード)からen_US
AP

en_USに変更した後の同じエラー。
Meetanshi 2017

なんとか立ち上がったが、fi_FIに戻ろうとしたときの行き止まり。キャッシュをクリアしましたか?
AP

はい、キャッシュをクリアしました
Meetanshi 2017

1

substr関数に注意してください。UTF-8はサポートしていません。そして、これはFPCを壊す可能性があります。mb_substrを使用する


0

私にとっての解決策は、翻訳csvファイルの「ä」のようなすべての特殊文字を、次のような同じ文字のhtmlバージョンで置き換えることでした。

&auml;

次に、キャッシュをクリアしてフロントエンドをリロードしました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.