마 젠토 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

캐시를 지우려고 했습니까? 마 젠토 캐시뿐만 아니라 외부 캐시도 있습니다.
MGento

예, 시도했습니다.
Meetanshi

직렬화하려는 데이터를 찾으려고 할 수 있습니까? 타사 모듈을 탐색하고 어떤 모듈에서이 오류가 발생했는지 확인하십시오. /vendor/magento/framework/Serialize/Serializer/Json.php
MGento

이 오류는 DB 업데이트 도중 또는 DB를 2.2.1로 업데이트 한 후에 발생합니까?
drew7721

답변:


4

템플릿과 동일한 동작을합니다. 내 문제를 얻기 위해 오류 코드를 serializer에 복사했습니다.

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를 통해 다운로드했습니다. 메모장 ++는 "Ansii Encoding"을 보여주었습니다-번역 파일을 만들기 위해 "magento i18n : collect-phrases"를 사용했습니다.

magento2dev # encguess app/code/MyTheme/Bannerslider/i18n/de_DE.csv

앱 / 코드 /MyTheme/Bannerslider/i18n/de_DE.csv US-ASCII

magento2dev # locale
LANG=de_DE.UTF-8
......

그래서 메모장 ++에서 파일을 수동으로 변경하고 업로드하고 정적 콘텐츠를 배포하고 모든 권한을 재설정했습니다.

따라서 버그는 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;
}

찾을 수없는 serializer는 다음 방법에서 나옵니다.

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

에 대한 환경 설정 SerializerInterface은 Magento 2.2.x 버전 이후에 추가되었으며 app / etc / di.xml에 선언되었습니다 .

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

따라서 캐시가 오래되었거나 기본 설정 SerializerInterface이 작동하지 않는다고 생각합니다 . Magento\Framework\Serialize\SerializerInterface코드에서 (종속성 주입 사용) somwhere를 호출 하여이 문제를 디버깅 하고 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을 사용하여 모든 이전 데이터를 직렬화 해제하고 직렬화해야합니다.

추신 : 디버깅 완료 후 핵심 파일을 되 돌리는 것을 잊지 마십시오! 더 좋은 방법은 xDebug를 사용하는 것입니다.


2
디버거 헬퍼를 핵심 패치로 만들거나 SAFE PHP github.com/thecodingmachine/safe
Alex

2

필자의 경우 UTF8 인코딩 문제의 원인은 멀티 바이트가 아닌 안전한 제품 이름 단축이었습니다.

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

그래서

012345678901234567890123456789012345678901234567890123456 Außengewinde 

되었다

012345678901234567890123456789012345678901234567890123456 Au�...

이것은 또한 우리의 문제였습니다. "mb_substr"와 "SUBSTR"를 대체하여 ixed
amesh

매력처럼 작동합니다 !!!
Bharat Sevra

2

substr 기능에주의하십시오. UTF-8을 지원하지 않습니다. 그리고 이것은 FPC를 망칠 수 있습니다. mb_substr 사용


1

2.2.1로 업그레이드 할 때도 같은 문제가 발생했습니다. 이 articel이 매우 유용하다는 것을 알았습니다 http://devdocs.magento.com/guides/v2.2/ext-best-practices/tutorials/serialized-to-json-data-upgrade.html

DB에 저장된 데이터는 더 이상 직렬화되어서는 안되며 이제 JSON 객체로 저장해야합니다.

대부분의 모듈은 데이터를 DB에서 직렬화 해제하고 JSON 형식으로 다시 저장하는 데이터 업데이트를 수행합니다. (BTW 이것을 실행하는 데 꽤 오랜 시간이 걸렸습니다 ...)

따라서 모듈 중 하나가 DB에서 직렬화 된 데이터를 저장하면 더 이상 Magento가 해당 데이터를 읽을 수없는 경우 데이터 업그레이드 설정 파일을 만들어야합니다. 또한 2.2 이상 호환 버전으로 업데이트해야하는 타사 모듈 일 수 있습니다.

코드의 어느 곳에서나 직렬화 해제 데이터를 직렬화하면 변경해야 할 수도 있습니다.

이것이 오류의 원인에 대한 더 나은 통찰력을 제공하기를 바랍니다.

건배!


2.2.1 릴리스 정보를 읽으십시오 generation. 폴더 경로를 포함하여 로트가 변경되었습니다 . ;)
drew7721

1

나는 정확히 같은 상황에 이르렀다. 위의 코드를 추가 한 후 "잘못된 UTF-8 문자로 잘못 인코딩되었습니다"라는 메시지가 나타납니다.

기본 언어를 사용하지 않는 것으로 가정합니다. 언어를 "default"en_US로 변경하십시오.

Meetanshi-프론트 엔드에서 어떤 언어를 사용하고 있으며 정적 컨텐츠 작성도 실패합니까?


안녕하세요 @AP, 나는 같은 오류에 직면하고 있으며 de_DE 언어를 사용하고 있습니다.
Meetanshi

en_US로 변경해보십시오. en_US
AP의

en_US로 변경 한 후 동일한 오류가 발생했습니다.
Meetanshi

나는 그것을 얻을 수 있었지만 fi_FI로 돌아갈 때 막 다른 골목. 캐시를 지웠습니까?
AP

예, 캐시를 지 웠습니다
Meetanshi가

0

나를 위해 해결책은 번역 csv 파일의 "ä"와 같은 모든 특수 문자를 다음과 같은 문자의 html 버전으로 바꾸는 것이 었습니다.

&auml;

그런 다음 캐시를 지우고 프런트 엔드를 다시로드했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.