def _read_object(self, ref):
    '\n        read the object by reference.\n        May recursively read sub-objects (content of an array/dict/set)\n        '
    result = self._objects[ref]
    if (result is not _undefined):
        return result
    offset = self._object_offsets[ref]
    self._fp.seek(offset)
    token = ord(self._fp.read(1)[0])
    (tokenH, tokenL) = ((token & 240), (token & 15))
    if (token == 0):
        result = None
    elif (token == 8):
        result = False
    elif (token == 9):
        result = True
    elif (token == 15):
        result = b''
    elif (tokenH == 16):
        result = 0
        for k in xrange(((2 << tokenL) - 1)):
            result = ((result << 8) + ord(self._fp.read(1)))
    elif (token == 34):
        result = struct.unpack('>f', self._fp.read(4))[0]
    elif (token == 35):
        result = struct.unpack('>d', self._fp.read(8))[0]
    elif (token == 51):
        f = struct.unpack('>d', self._fp.read(8))[0]
        result = (datetime.datetime(2001, 1, 1) + datetime.timedelta(seconds=f))
    elif (tokenH == 64):
        s = self._get_size(tokenL)
        if self._use_builtin_types:
            result = self._fp.read(s)
        else:
            result = plistlib.Data(self._fp.read(s))
    elif (tokenH == 80):
        s = self._get_size(tokenL)
        result = self._fp.read(s).decode('ascii')
        result = result
    elif (tokenH == 96):
        s = self._get_size(tokenL)
        result = self._fp.read((s * 2)).decode('utf-16be')
    elif (tokenH == 160):
        s = self._get_size(tokenL)
        obj_refs = self._read_refs(s)
        result = []
        self._objects[ref] = result
        result.extend((self._read_object(x) for x in obj_refs))
    elif (tokenH == 208):
        s = self._get_size(tokenL)
        key_refs = self._read_refs(s)
        obj_refs = self._read_refs(s)
        result = self._dict_type()
        self._objects[ref] = result
        for (k, o) in zip(key_refs, obj_refs):
            key = self._read_object(k)
            if isinstance(key, plistlib.Data):
                key = key.data
            result[key] = self._read_object(o)
    else:
        raise InvalidFileException()
    self._objects[ref] = result
    return result
read the object by reference.
May recursively read sub-objects (content of an array/dict/set)
def _read_object(self, ref):
    '\n        read the object by reference.\n        May recursively read sub-objects (content of an array/dict/set)\n        '
    result = self._objects[ref]
    if (result is not _undefined):
        return result
    offset = self._object_offsets[ref]
    self._fp.seek(offset)
    token = ord(self._fp.read(1)[0])
    (tokenH, tokenL) = ((token & 240), (token & 15))
    if (token == 0):
        result = None
    elif (token == 8):
        result = False
    elif (token == 9):
        result = True
    elif (token == 15):
        result = b
    elif (tokenH == 16):
        result = 0
        for k in xrange(((2 << tokenL) - 1)):
            result = ((result << 8) + ord(self._fp.read(1)))
    elif (token == 34):
        result = struct.unpack('>f', self._fp.read(4))[0]
    elif (token == 35):
        result = struct.unpack('>d', self._fp.read(8))[0]
    elif (token == 51):
        f = struct.unpack('>d', self._fp.read(8))[0]
        result = (datetime.datetime(2001, 1, 1) + datetime.timedelta(seconds=f))
    elif (tokenH == 64):
        s = self._get_size(tokenL)
        if self._use_builtin_types:
            result = self._fp.read(s)
        else:
            result = plistlib.Data(self._fp.read(s))
    elif (tokenH == 80):
        s = self._get_size(tokenL)
        result = self._fp.read(s).decode('ascii')
        result = result
    elif (tokenH == 96):
        s = self._get_size(tokenL)
        result = self._fp.read((s * 2)).decode('utf-16be')
    elif (tokenH == 160):
        s = self._get_size(tokenL)
        obj_refs = self._read_refs(s)
        result = []
        self._objects[ref] = result
        result.extend((self._read_object(x) for x in obj_refs))
    elif (tokenH == 208):
        s = self._get_size(tokenL)
        key_refs = self._read_refs(s)
        obj_refs = self._read_refs(s)
        result = self._dict_type()
        self._objects[ref] = result
        for (k, o) in zip(key_refs, obj_refs):
            key = self._read_object(k)
            if isinstance(key, plistlib.Data):
                key = key.data
            result[key] = self._read_object(o)
    else:
        raise InvalidFileException()
    self._objects[ref] = result
    return result