Hazelcast 和 python 没有适合类型 -120 的反序列化器

Hazelcast and python there is no suitable de-serializer for type -120

你好,我想客户端和成员配置有问题,我应该使用哪个配置,正如你所看到的,当我调用 get_data 它 returns 时,我正在插入 json 作为数据 returns问题但是当我尝试使用 predicate-sql 它给我错误“hazelcast.errors.HazelcastSerializationError:来自服务器的异常:com.hazelcast.nio.serialization.HazelcastSerializationException:没有适合类型 -120 的反序列化器。这个异常是可能由 t 的差异引起 成员之间或客户端与成员之间的序列化配置。"

@app.route('/insert_data/<database_name>/<collection_name>', methods=['POST'])
def insert_data(database_name, collection_name):
    client = hazelcast.HazelcastClient(cluster_members=[
        url
    ])
    dbname_map = client.get_map(f"{database_name}-{collection_name}").blocking()

    if request.json:
        received_json_data = request.json
        received_id = received_json_data["_id"]
        del received_json_data["_id"]
        dbname_map.put(received_id, received_json_data)
        client.shutdown()
        return jsonify()

    else:
        client.shutdown()
        abort(400)

@app.route('/get_data/<database_name>/<collection_name>', methods=['GET'])
def get_all_data(database_name, collection_name):
    client = hazelcast.HazelcastClient(cluster_members=[
        url
    ])
    dbname_map = client.get_map(f"{database_name}-{collection_name}").blocking()
    entry_set = dbname_map.entry_set()
    output = dict()
    datas = []
    for key, value in entry_set:
        value['_id'] = key
        output = value
        datas.append(output)

    client.shutdown()
    return jsonify({"Result":datas})

@bp.route('/get_query/<database_name>/<collection_name>/<name>', methods=['GET'])
def get_query_result(database_name, collection_name,name):
     client = hazelcast.HazelcastClient(cluster_members=[
        url
    ])
    predicate_map = client.get_map(f"{database_name}-{collection_name}").blocking()
    predicate = and_(sql(f"name like {name}%"))
    entry_set = predicate_map.values(predicate)
    #entry_set = predicate_map.entry_set(predicate)

    send_all_data = ""
    for x in entry_set:
        send_all_data += x.to_string()
        send_all_data += "\n"
        print(send_all_data)
    # print("Retrieved %s values whose age is less than 30." % len(result))
    # print("Entry is", result[0].to_string())
    # value=predicate_map.get(70)
    # print(value)
    return jsonify()

我尝试根据 hazelcast-full-example.xml 更改 hazelcast.xml 但我无法在之后启动 hazelcast 变化,我真的必须使用序列化吗?淡褐色 version:4.1 python:3.9

这很可能发生,因为您正在将类型字典的条目放入映射中,该映射由 pickle 序列化,因为您没有为此指定序列化程序,并且客户端不知道如何正确处理它,所以它回退到默认的序列化程序。但是,由于 pickle 序列化是 Python 特定的,服务器无法反序列化它并抛出这样的异常。

有可能的解决方案,详情请参阅 https://hazelcast.readthedocs.io/en/stable/serialization.html 章节。

我认为最适合您的用例的解决方案是便携式序列化,它不需要服务器端的配置更改或代码。参见 https://hazelcast.readthedocs.io/en/stable/serialization.html#portable-serialization

顺便说一句,客户端对象非常重量级,因此您不应该像这样按需创建它们。由于它是线程安全的,因此您可以在您的应用程序中构造一次并在您的端点或业务逻辑代码中自由共享和使用它。这同样适用于您从客户端获得的地图代理。也可以重复使用