当前位置: 首页 > 知识库问答 >
问题:

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

曹浩
2023-03-14

您好,我猜客户端和成员配置有问题,我应该使用哪个配置,正如您所看到的,当我调用get_data时,它返回时没有问题,但当我尝试使用谓词sql时,它会给我错误消息“hazelcast.errors.HazelcastSerializationError:服务器异常:com.hazelcast.nio.serialization.HazelcastSerializationException:没有适合类型-120的反序列化程序。此异常可能是由成员之间或客户端与成员之间的序列化配置差异造成的。”

@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()

我试图改变黑泽尔卡斯特。xml根据hazelcast的完整示例。xml,但我不能在更改后启动hazelcast,我真的必须使用序列化吗?hazelcast版本:4.1 python:3.9

共有1个答案

钦枫
2023-03-14

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

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

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

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

 类似资料:
  • 是否有可能在不访问源. proto文件/生成的类的情况下反序列化原型消息?我的源系统使用Ruby生成消息,并使用Java。源系统可以创建消费者无法轻松了解的新消息格式。或者,消费者访问原始类的最佳方式是什么?有没有可能有某种原始存储库?

  • 我有一门课是这样的: 但是当我试图序列化它时,我收到一个错误,上面写着“试图序列化java.lang.class:java.lang.字符串。忘记注册一个类型适配器了吗?”。所以我创建了这个适配器: } 并登记如下: 但我还是犯了同样的错误<我做错了什么 适配器的实现看起来正常吗?

  • 考虑以下代码片段,以获取/提交collections.synchronizedSet到/从Hazelcast: 在此代码运行几次之后(不确定有多少次,也不确定为什么),在试图从Hazelcast(上面标记的)获取集合时,会触发以下操作:

  • 我目前正在努力反序列化JSON数据结构,如下所示: 示例1: 示例 2: 我必须处理许多此类结构的实例。它是规则生成器的输出。我无法更改JSON的格式,我必须使用我得到的东西。该结构是递归的,可以有多个级别。 我正在使用Jackson的ObjectMapper并构建一些内部类来映射数据。 大多数实例看起来像示例1,对于那些已经很好地工作的实例,但是有一些更复杂的实例,比如示例2,实际上比示例2更复

  • 本文向大家介绍Python pickle类库介绍(对象序列化和反序列化),包括了Python pickle类库介绍(对象序列化和反序列化)的使用技巧和注意事项,需要的朋友参考一下 一、pickle pickle模块用来实现python对象的序列化和反序列化。通常地pickle将python对象序列化为二进制流或文件。   python对象与文件之间的序列化和反序列化: 如果要实现python对象和

  • 问题内容: 我正在尝试制作一个使用Jackson来反序列化POJO的类。 看起来像这样… 我对此实施有2个问题。 首先是我将类类型传递给方法,以便对象映射器知道应反序列化的类型。有使用泛型的更好方法吗? 同样在get方法中,我将一个从objectMapper返回的对象强制转换为T。这看起来特别讨厌,因为我必须在此处强制转换T,然后还必须从调用它的方法中强制转换对象类型。 我在该项目中使用了Robo