def _process_param_value(self, value):
        """
        Returns a UTF-8 string representation of the parameter value,
        recursing into lists.
        """
        # Extract IDs from objects
        if isinstance(value, TroveboxObject):
            return str(value.id).encode('utf-8')

        # Ensure strings are UTF-8 encoded
        elif isinstance(value, TEXT_TYPE):
            return value.encode("utf-8")

        # Handle lists
        elif isinstance(value, list):
            # Make a copy of the list, to avoid overwriting the original
            new_list = list(value)
            # Process each item in the list
            for i, item in enumerate(new_list):
                new_list[i] = self._process_param_value(item)
            # new_list elements are UTF-8 encoded strings - simply join up
            return b','.join(new_list)

        # Handle booleans
        elif isinstance(value, bool):
            return b"1" if value else b"0"

        # Unknown - just do our best
        else:
            return str(value).encode("utf-8")