code: public MemcachedBackupSession deserialize( final byte[] data, final SessionManager manager ) {
          if ( data == null ) {
              return null;
          }
          try {
              final DeserializationResult deserializationResult = deserializeSessionFields( data, manager );
              final byte[] attributesData = deserializationResult.getAttributesData();
              final ConcurrentMap<String, Object> attributes = deserializeAttributes( attributesData );
              final MemcachedBackupSession session = deserializationResult.getSession();
              session.setAttributesInternal( attributes );
              session.setDataHashCode( Arrays.hashCode( attributesData ) );
              session.setManager( manager );
              session.doAfterDeserialization();
              return session;
          } catch( final InvalidVersionException e ) {
              LOG.info( "Got session data from memcached with an unsupported version: " + e.getVersion() );
              // for versioning probably there will be changes in the design,
              // with the first change and version 2 we'll see what we need
              return null;
          }
      }
docs: Deserialize session data that was serialized using {@link #serialize(MemcachedBackupSession)}
  (or a combination of {@link #serializeAttributes(MemcachedBackupSession, ConcurrentMap)} and
  {@link #serialize(MemcachedBackupSession, byte[])}).
  <p>
  Note: the returned session already has the manager set and
  {@link MemcachedBackupSession#doAfterDeserialization()} is invoked. Additionally
  the attributes hash is set (via {@link MemcachedBackupSession#setDataHashCode(int)}).
  </p>
  
  @param data the byte array of the serialized session and its session attributes. Can be <code>null</code>.
  @param manager the manager to set on the deserialized session.
  
  @return the deserialized {@link MemcachedBackupSession}
  or <code>null</code> if the provided <code>byte[] data</code> was <code>null</code>.