Apache kafka streams 我在哪里可以找到ArrayListSerde?

Apache kafka streams 我在哪里可以找到ArrayListSerde?,apache-kafka-streams,Apache Kafka Streams,我需要一个用于ArrayList的Serde,在web上搜索ArrayListSerde可以找到对此类内容的引用,但在我使用的Kafka Streams版本的文档或库中都找不到它。请问在哪里可以找到它?KStream library没有提供ArrayListSerde的正式实现。您需要使用序列化器和反序列化器接口实现自定义Serde 下文也提到: 我正在尝试类似的东西。它看起来做了一些合理的事情,尽管我还不确信我用null参数来序列化(还不知道为什么用null调用它) 公共类ArrayList

我需要一个用于ArrayList的Serde,在web上搜索ArrayListSerde可以找到对此类内容的引用,但在我使用的Kafka Streams版本的文档或库中都找不到它。请问在哪里可以找到它?

KStream library没有提供ArrayListSerde的正式实现。您需要使用序列化器和反序列化器接口实现自定义Serde

下文也提到:


我正在尝试类似的东西。它看起来做了一些合理的事情,尽管我还不确信我用
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;
            }
        };
    }
}