def loads(string, *transformers, **kwargs):
    """
    Deserializes Java objects and primitive data serialized using
    ObjectOutputStream from a string.

    :param string: A Java data string
    :param transformers: Custom transformers to use
    :param ignore_remaining_data: If True, don't log an error when unused
                                  trailing bytes are remaining
    :return: The deserialized object
    """
    # Read keyword argument
    ignore_remaining_data = kwargs.get("ignore_remaining_data", False)

    # Reuse the load method (avoid code duplication)
    return load(
        BytesIO(string), *transformers, ignore_remaining_data=ignore_remaining_data
    )