@classmethod
def from_bytes(cls, data, timestamp, instance_id, offset=0):
    """ Deserializes and creates an instance of this object.

         - data: the data to deserialize
         - timestamp: the timestamp to put on the object instance
         - offset: an optional index into data where to begin deserialization
        """
    unpack_field_values = cls._packstruct.unpack_from(data, offset)
    field_values = []
    field_values.append(cls._name)
    if timestamp is not None:
        field_values.append(timestamp / 1000.0)
    field_values.append(cls._id)
    if instance_id is not None:
        field_values.append(instance_id)
    if not cls._flat:
        pos = 0
        for n in cls._num_subelems:
            if n == 1:
                field_values.append(unpack_field_values[pos])
            else:
                field_values.append(tuple(unpack_field_values[pos:pos + n]))
            pos += n
        field_values = tuple(field_values)
    else:
        field_values = tuple(field_values) + tuple(unpack_field_values)
    return cls._make(field_values)
