Serializes the binaryItems contained in binaryItemContainer and writes
    them into a zipfile archive.

    Examples of binaryItem classes are :class:`maspy.core.Ci` and
    :class:`maspy.core.Sai`. A binaryItem class has to define the function
    ``_reprJSON()`` which returns a JSON formated string representation of the
    class instance. In addition it has to contain an attribute ``.arrays``, a
    dictionary which values are ``numpy.array``, that are serialized to bytes
    and written to the ``binarydata`` file of the zip archive. See
    :func:`_dumpArrayDictToFile()`

    The JSON formated string representation of the binaryItems, together with
    the metadata, necessary to restore serialized numpy arrays, is written
    to the ``metadata`` file of the archive in this form:
    ``[[serialized binaryItem, [metadata of a numpy array, ...]], ...]``

    Use the method :func:`loadBinaryItemContainer()` to restore a
    binaryItemContainer from a zipfile.

    :param filelike: path to a file (str) or a file-like object
    :param binaryItemContainer: a dictionary containing binaryItems
    :param compress: bool, True to use zip file compression

def writeBinaryItemContainer(filelike, binaryItemContainer, compress=True):
    """Serializes the binaryItems contained in binaryItemContainer and writes
    them into a zipfile archive.

    Examples of binaryItem classes are :class:`maspy.core.Ci` and
    :class:`maspy.core.Sai`. A binaryItem class has to define the function
    ``_reprJSON()`` which returns a JSON formated string representation of the
    class instance. In addition it has to contain an attribute ``.arrays``, a
    dictionary which values are ``numpy.array``, that are serialized to bytes
    and written to the ``binarydata`` file of the zip archive. See
    :func:`_dumpArrayDictToFile()`

    The JSON formated string representation of the binaryItems, together with
    the metadata, necessary to restore serialized numpy arrays, is written
    to the ``metadata`` file of the archive in this form:
    ``[[serialized binaryItem, [metadata of a numpy array, ...]], ...]``

    Use the method :func:`loadBinaryItemContainer()` to restore a
    binaryItemContainer from a zipfile.

    :param filelike: path to a file (str) or a file-like object
    :param binaryItemContainer: a dictionary containing binaryItems
    :param compress: bool, True to use zip file compression
    """
    allMetadata = dict()
    binarydatafile = io.BytesIO()
    #Note: It would be possible to sort the items here
    for index, binaryItem in enumerate(viewvalues(binaryItemContainer)):
        metadataList = _dumpArrayDictToFile(binarydatafile, binaryItem.arrays)
        allMetadata[index] = [binaryItem._reprJSON(), metadataList]

    #TODO: Is seek here still necessary?
    binarydatafile.seek(0)

    zipcomp = zipfile.ZIP_DEFLATED if compress else zipfile.ZIP_STORED
    with zipfile.ZipFile(filelike, 'w', allowZip64=True) as containerFile:
        containerFile.writestr('metadata',
                               json.dumps(allMetadata, cls=MaspyJsonEncoder),
                               zipcomp
                               )
        containerFile.writestr('binarydata', binarydatafile.getvalue(), zipcomp)