我的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);
不知道为什么,但它现在起作用了。