public function unmarshall(ServletSessionInterface $servletSession, $marshalled)
    {

        // try to decode the string
        $decodedSession = json_decode($marshalled, true);

        // query whether or not the session data has been encoded successfully
        if (json_last_error() !== JSON_ERROR_NONE) {
            throw new SessionDataNotReadableException(json_last_error_msg());
        }

        // extract the values
        $id = $decodedSession[StandardSessionMarshaller::ID];
        $name = $decodedSession[StandardSessionMarshaller::NAME];
        $lifetime = $decodedSession[StandardSessionMarshaller::LIFETIME];
        $maximumAge = $decodedSession[StandardSessionMarshaller::MAXIMUM_AGE];
        $domain = $decodedSession[StandardSessionMarshaller::DOMAIN];
        $path = $decodedSession[StandardSessionMarshaller::PATH];
        $secure = $decodedSession[StandardSessionMarshaller::SECURE];
        $httpOnly = $decodedSession[StandardSessionMarshaller::HTTP_ONLY];
        $data = $decodedSession[StandardSessionMarshaller::DATA];
        $lastActivityTimestamp = $decodedSession[StandardSessionMarshaller::LAST_ACTIVITY_TIMESTAMP];

        // initialize the instance
        $servletSession->init($id, $name, $lifetime, $maximumAge, $domain, $path, $secure, $httpOnly, $lastActivityTimestamp);

        // append the session data
        foreach ($data as $key => $value) {
            $servletSession->putData($key, unserialize($value));
        }
    }