skip to Main Content

I migrated magento site from 1.7.0.2 to 2.2 clean install.
Migration completed without issues.

However if I attempt to edit a product or add a new product magento displays an error:

Unable to unserialize value.

Does anyone know what im doing wrong here?

Customers, categories and custom attributes all migrated without issue

2

Answers


  1. The problem is in /vendor/magento/framework/Serialize/Serializer/Json.php

    There is a function unserialize($string) which gives you a syntax error if a string is serialized (not json but php serialization).

    Change unserialize to:

    public function unserialize($string)
    {
        if($this->is_serialized($string)) {
            $string = $this->serialize($string);
        }
        $result = json_decode($string, true);
        if (json_last_error() !== JSON_ERROR_NONE) {
             throw new InvalidArgumentException('Unable to unserialize value.');
        }
        return $result;
    }
    

    And add function to check if string is serialized:

    function is_serialized($value, &$result = null)
    {
        if (!is_string($value)) {
            return false;
        }
        if ($value === 'b:0;') {
            $result = false;
            return true;
        }
        $length = strlen($value);
        $end    = '';
        switch ($value[0]) {
            case 's':
                if ($value[$length - 2] !== '"') {
                    return false;
                }
            case 'b':
            case 'i':
            case 'd':
                // This looks odd but it is quicker than isset()ing
                $end .= ';';
            case 'a':
            case 'O':
                $end .= '}';
                if ($value[1] !== ':') {
                    return false;
                }
                switch ($value[2]) {
                    case 0:
                    case 1:
                    case 2:
                    case 3:
                    case 4:
                    case 5:
                    case 6:
                    case 7:
                    case 8:
                    case 9:
                        break;
                    default:
                        return false;
                }
            case 'N':
                $end .= ';';
                if ($value[$length - 1] !== $end[0]) {
                    return false;
                }
                break;
            default:
                return false;
        }
        if (($result = @unserialize($value)) === false) {
            $result = null;
            return false;
        }
        return true;
    }
    

    After doing this you solve your problem.

    Login or Signup to reply.
  2. I ran into this problem when doing the migration from 1.9.2.0 to 2.3.2.
    My additional_information in table sales_payment_transaction was empty. The error occurs in class MigrationHandlerSerializeToJson in method handle in string number 73: $unserializeData = unserialize($value);
    I made preference for this class and changed unserialize() function to json_decode().

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search