Nifi+Redis生成一个奇怪的缓存密钥/val-如何正确地序列化/反序列化



我的Nifi处理器实现正在生成一个奇怪的缓存键和值,类似于'xac\xxed\x00\x05t\x00\x06'的内容被前置到每个键/值。例如,插入'key':'val'会生成"\xac\x0\x05t\x0\x03key":"\xac\x0\x05t\x0\x03val";。

Nifi在后台使用春季数据,此处描述问题:

Spring boot+Redis-生成一个奇怪的密钥

带有redis的春季启动缓存,密钥具有\xac\xix\x00\x05t\x00\x06

Nifi处理器只是覆盖所提供方法的java代码。

我没有spring-config可用于编辑或spring数据类,这些都是在Nifi的实现中完成的。我所拥有和必须提供的只是串行器和反序列化器:

void serialize(T value, OutputStream output) throws SerializationException, IOException;
T deserialize(byte[] input) throws DeserializationException, IOException;

例如,getAndPutIfAbsent方法如下所示:

cache.getAndPutIfAbsent(key, value, keySerializer, valueSerializer, valueDeserializer);

我的字节序列化/反序列化很简单:

public static byte[] serialize(Object obj) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream os = new ObjectOutputStream(out);
os.writeObject(obj);
return out.toByteArray();
}
public static Object deserialize(byte[] data) {
if (data == null || data.length == 0) return null;
try {
ByteArrayInputStream in = new ByteArrayInputStream(data);
ObjectInputStream is = new ObjectInputStream(in);
return is.readObject();
} catch (Exception e) {
// log
}
return null;
}

这将生成带有预设值的keys/vals。Put和get-down工作,我可以使用相同的序列化程序和反序列化程序获得以前放入的值,只有一种情况除外。

我有几个缓存,它们都使用上面粘贴的相同对象序列化器/反序列化器。正如我提到的,除了我使用扫描方法(分页所有键(的一个缓存外,其他一切都可以工作。在密钥反序列化时,它抛出:java无效流头:EFBFBDEF。我不明白为什么其他缓存可以工作,但这一个抛出了异常,它们都在序列化/反序列化相同的缓存。

我的目标是在没有预先准备好的字符的情况下获得key/vals,并始终如一地工作。我不能修改spring的配置和类。如何继续?

对字符串使用以下反序列化修复了这两个问题:

value.getBytes(StandardCharsets.UTF_8)
new String(value, StandardCharsets.UTF_8);

不知道为什么,但它现在起作用了。

最新更新