static DeserializationResult deserializeSessionFields( final byte[] data, final SessionManager manager) throws InvalidVersionException { final MemcachedBackupSession result = manager.newMemcachedBackupSession(); final short version = (short) decodeNum(data, 0, 2); if (version != CURRENT_VERSION) { throw new InvalidVersionException( "The version " + version + " does not match the current version " + CURRENT_VERSION, version); } final short sessionFieldsDataLength = (short) decodeNum(data, 2, 2); result.setCreationTimeInternal(decodeNum(data, 4, 8)); result.setLastAccessedTimeInternal(decodeNum(data, 12, 8)); result.setMaxInactiveInterval((int) decodeNum(data, 20, 4)); result.setIsNewInternal(decodeBoolean(data, 24)); result.setIsValidInternal(decodeBoolean(data, 25)); result.setThisAccessedTimeInternal(decodeNum(data, 26, 8)); result.setLastBackupTime(decodeNum(data, 34, 8)); final short idLength = (short) decodeNum(data, 42, 2); result.setIdInternal(decodeString(data, 44, idLength)); final short authTypeId = (short) decodeNum(data, 44 + idLength, 2); result.setAuthTypeInternal(AuthType.valueOfId(authTypeId).getValue()); final int currentIdx = 44 + idLength + 2; final short principalDataLength = (short) decodeNum(data, currentIdx, 2); if (principalDataLength > 0) { final byte[] principalData = new byte[principalDataLength]; System.arraycopy(data, currentIdx + 2, principalData, 0, principalDataLength); result.setPrincipalInternal(deserializePrincipal(principalData, manager)); } final byte[] attributesData = new byte[data.length - sessionFieldsDataLength]; System.arraycopy( data, sessionFieldsDataLength, attributesData, 0, data.length - sessionFieldsDataLength); return new DeserializationResult(result, attributesData); }