商业版中,消息以$binary base 64 的方式存储在mongdb 中,$binary 是如何读取出来,转换成WFCMessage.MessageContent 或MessagePayload,

lovo1 3月前 162

{ "_id": 381726782864228500, "_from": "114", "_type": 1, "_target": "tomo@liao2222", "_line": 0, "_data": { "$binary": { "base64": "CGgqOXsiZyI6InRvbW9AbGlhbzIyMjIiLCJvIjoiMTE0IiwibiI6IlJvb20gb2YgbnVsbCIsIm0iOiIifQ==", "subType": "00" } }, "_content_type": 104, "_dt": { "$date": "2023-10-08T09:31:54.35Z" }, "_searchable_key": "" }

最新回复 (3)
  • lovo1 3月前
    引用 2
    我感觉与  社区版 : WFCMessage.MessageContent messageContent = WFCMessage.MessageContent.parseFrom(encryptMessageContent(toByteArray(blob.getBinaryStream()), false));
    肯定有不同的地方,社区版存储的blob,通过blob.getBinaryStream() 直接获取流转换的,blob 字段可以直接转成String 字符串,无需解码。
  • HeavyRain 3月前
    引用 3
    这个_data是二进制数据,读取出来二进制后,用WFCMessage.MessageContent.parseFrom(二进制数据)就可以得到WFCMessage.MessageContent。

    不要把_data字段解析成字符串,在某些消息下可能是字符串,在某些消息下是二进制,要统一读取二进制才能正确处理
  • HeavyRain 3月前
    引用 4

    下面是专业版IM服务读取的代码

            Binary blob = document.get("_data", Binary.class);
            byte[] bytes = blob.getData();
            WFCMessage.MessageContent messageContent = WFCMessage.MessageContent.parseFrom(encryptMessageContent(bytes, false));
返回