<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:

async def serialize(self, native=False):
        '''
        Returns a serialized from of the model taking into account projection rules and ``@serialize`` decorated methods.
        
        :param native:
            Deternines if data is serialized to Python native types or primitive form. Defaults to ``False``
        '''
        data = {}
        # iterate through all fields
        for field_name, field in self._fields.items():
            # serialize field data
            raw_data = self._data.get(field_name)
            # add field's data to model data based on projection settings
            if field._projection != None:  # noqa E711
                field_data = await field.serialize(raw_data, native)
                if field_data:
                    data[field_name] = field_data
                elif field._projection == True: # noqa E711
                    data[field_name] = None

        # iterate through all export methods
        for name, func in self._serialize_methods.items():
            data[name] = await func(self)
        return data