Apache kafka streams 我在哪里可以找到ArrayListSerde?
我需要一个用于ArrayList的Serde,在web上搜索ArrayListSerde可以找到对此类内容的引用,但在我使用的Kafka Streams版本的文档或库中都找不到它。请问在哪里可以找到它?KStream library没有提供ArrayListSerde的正式实现。您需要使用序列化器和反序列化器接口实现自定义Serde 下文也提到:Apache kafka streams 我在哪里可以找到ArrayListSerde?,apache-kafka-streams,Apache Kafka Streams,我需要一个用于ArrayList的Serde,在web上搜索ArrayListSerde可以找到对此类内容的引用,但在我使用的Kafka Streams版本的文档或库中都找不到它。请问在哪里可以找到它?KStream library没有提供ArrayListSerde的正式实现。您需要使用序列化器和反序列化器接口实现自定义Serde 下文也提到: 我正在尝试类似的东西。它看起来做了一些合理的事情,尽管我还不确信我用null参数来序列化(还不知道为什么用null调用它) 公共类ArrayList
我正在尝试类似的东西。它看起来做了一些合理的事情,尽管我还不确信我用
null
参数来序列化
(还不知道为什么用null
调用它)
公共类ArrayListSerde实现Serde{
私有最终序列化程序innerSerialiser;
私有最终反序列化程序InnerDeserializer;
公共ArrayListSerde(内部Serde){
innerSerialiser=inner.serializer();
InnerDeserializer=inner.deserializer();
}
@凌驾
公共序列化程序序列化程序(){
返回新的序列化程序(){
@凌驾
公共字节[]序列化(字符串主题,ArrayList数据){
最终ByteArrayOutputStream bas=新ByteArrayOutputStream();
如果(数据!=null){
最终整数大小=data.size();
最终数据输出流dos=新数据输出流(BAS);
final Iterator Iterator=data.Iterator();
试一试{
dos.writeInt(大小);
while(iterator.hasNext()){
final byte[]bytes=innerSerialiser.serialize(主题,iterator.next());
dos.writeInt(字节.长度);
写入(字节);
}
}捕获(IOE异常){
抛出新的RuntimeException(“无法序列化ArrayList”,e);
}
}
返回baos.toByteArray();
}
};
}
@凌驾
公共反序列化程序反序列化程序(){
返回新的反序列化程序(){
@凌驾
公共ArrayList反序列化(字符串主题,字节[]数据){
if(data==null | | data.length==0){
返回null;
}
最终ArrayList ArrayList=新ArrayList();
最终DataInputStream DataInputStream=新的DataInputStream(新的ByteArrayInputStream(数据));
试一试{
final int records=dataInputStream.readInt();
for(int i=0;i
也许这会有所帮助。我看到了,作为你自己的例子,我认为这篇文章所说的实际上不起作用。但我看到过其他对这类事物的引用,好像它是一个您期望存在的标准类。。。我找不到。我没有找到任何标准的实现。但是,如果您应用Matthias J.Sax的答案(修复Serde中的构造函数)所建议的修复,代码应该可以正常工作。是的,我正在研究它的变体ta。标准实现是WIP,应该包含在2.4版本中:嘿,Tim,我也面临同样的问题。即使没有添加arg构造函数,也只有没有arg构造函数被调用,没有对象被初始化,我得到了npe。什么时候调用ArrayListSerde(Serde-inner)呢?明白了。这是我的StreamConfig值Serde的问题
public class ArrayListSerde<T> implements Serde<ArrayList<T>> {
private final Serializer <T> innerSerialiser;
private final Deserializer<T> innerDeserialiser;
public ArrayListSerde(Serde<T> inner) {
innerSerialiser = inner.serializer ();
innerDeserialiser = inner.deserializer();
}
@Override
public Serializer<ArrayList<T>> serializer() {
return new Serializer<ArrayList<T>>() {
@Override
public byte[] serialize(String topic, ArrayList<T> data) {
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
if (data != null ) {
final int size = data.size();
final DataOutputStream dos = new DataOutputStream(baos);
final Iterator<T> iterator = data.iterator();
try {
dos.writeInt(size);
while (iterator.hasNext()) {
final byte[] bytes = innerSerialiser.serialize(topic, iterator.next());
dos.writeInt(bytes.length);
dos.write(bytes);
}
} catch (IOException e) {
throw new RuntimeException("Unable to serialize ArrayList", e);
}
}
return baos.toByteArray();
}
};
}
@Override
public Deserializer<ArrayList<T>> deserializer() {
return new Deserializer<ArrayList<T>>() {
@Override
public ArrayList<T> deserialize(String topic, byte[] data) {
if (data == null || data.length == 0) {
return null;
}
final ArrayList<T> arrayList = new ArrayList<>();
final DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(data));
try {
final int records = dataInputStream.readInt();
for (int i = 0; i < records; i++) {
final byte[] valueBytes = new byte[dataInputStream.readInt()];
dataInputStream.read(valueBytes);
arrayList.add(innerDeserialiser.deserialize(topic, valueBytes));
}
} catch (IOException e) {
throw new RuntimeException("Unable to deserialize ArrayList", e);
}
return arrayList;
}
};
}
}