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



你好,我猜客户端和成员配置有问题,我应该使用哪个配置,你可以看到我插入json作为数据,当我调用get_data它返回没有问题,但当我尝试使用谓词sql它给我错误"hazelcast.errors。HazelcastSerializationError:来自server的异常:com.hazelcast.nio. serializer . 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.xml根据hazelcast-full-example.xml,但我不能开始hazelcast后我真的必须使用序列化吗?

这种情况很可能发生,因为您将dictionary类型的条目放入映射中,映射由pickle序列化,因为您没有为此指定序列化器,并且客户端不知道如何正确处理,因此它回退到默认序列化器。然而,由于pickle序列化是特定于python的,服务器不能反序列化它并抛出这样的异常。

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

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

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

最新更新