python 3.x – Implementation of queue Message class, so both small text messages and big binary messages can be passed

I want to use mptools in a project. In my code, I need to pass both big Numpy arrays and short text messages between projects. It would be nice if both kinds of messages could go over the same type of queue. Currently, the messages are implemented very nicely like this (in line 75):

# -- Standard Event Queue manager
class EventMessage:
    def __init__(self, msg_src, msg_type, msg):
        self.id = time.time()
        self.msg_src = msg_src
        self.msg_type = msg_type
        self.msg = msg

    def __str__(self):
        return f"{self.msg_src:10} - {self.msg_type:10} : {self.msg}"

How can I extend this, so it becomes as easy to use with my big, perhaps compressed, Numpy arrays?

When I send numpy arrays over a queue system there were some gymnastics involved:

    raw_array = np.array(list(item.values()))
    f = BytesIO() 
    np.savez(f, raw_array)
    f.seek(0)
    out = f.read()

Which I could send over the queue, and unpack on the other end. But there is no tagging of the message, no timestamp, etc., yet. How can I hide all those things as nicely as above, so it looks similar to this, which inherits from mpq.Queue, line 40 of the same file:

def safe_get(self, timeout=DEFAULT_POLLING_TIMEOUT):
    try:
        if timeout is None:
            return self.get(block=False)
        else:
            return self.get(block=True, timeout=timeout)
    except Empty:
        return None