Encoding Avro对列表进行序列化和去序列化<;UUID>;

Encoding Avro对列表进行序列化和去序列化<;UUID>;,encoding,avro,Encoding,Avro,我无法理解如何将列表序列化为二进制格式并反序列化回列表。为此,我尝试使用CustomEncoding: public class ListUUIDAsListStringEncoding extends CustomEncoding<List<UUID>> { { schema = Schema.createArray(Schema.createUnion(Schema.create(Schema.Type.STRING))); s

我无法理解如何将列表序列化为二进制格式并反序列化回列表。为此,我尝试使用CustomEncoding:

public class ListUUIDAsListStringEncoding extends CustomEncoding<List<UUID>> {
    {
        schema = Schema.createArray(Schema.createUnion(Schema.create(Schema.Type.STRING)));
        schema.addProp("CustomEncoding", "com.my.lib.common.schemaregistry.encoding.ListUUIDAsListStringEncoding");
    }

    @Override
    protected void write(Object datum, Encoder out) throws IOException {
        var list = (List<UUID>) datum;
        out.writeArrayStart();
        out.setItemCount(list.size());
        for (Object r : list) {
            if (r instanceof UUID) {
                out.startItem();
                out.writeString(r.toString());
            }
        }
        out.writeArrayEnd();
    }

    @Override
    protected List<UUID> read(Object reuse, Decoder in) throws IOException {
        var newArray = new ArrayList<UUID>();

        for (long i = in.readArrayStart(); i != 0; i = in.arrayNext()) {
            for (int j = 0; j < i; j++) {
                newArray.add(UUID.fromString(in.readString()));
            }
        }

        return newArray;
    }

}
公共类ListUUIDAsListStringEncoding扩展了CustomEncoding{
{
schema=schema.createArray(schema.createUnion(schema.create(schema.Type.STRING));
schema.addProp(“CustomEncoding”、“com.my.lib.common.schemaregistry.encoding.ListUUIDAsListStringEncoding”);
}
@凌驾
受保护的无效写入(对象数据、编码器输出)引发IOException{
var列表=(列表)数据;
out.writeArrayStart();
out.setItemCount(list.size());
用于(对象r:列表){
if(UUID的r实例){
out.startItem();
out.writeString(r.toString());
}
}
out.writearlayend();
}
@凌驾
受保护列表读取(对象重用、解码器插入)引发IOException{
var newArray=newarraylist();
for(长i=in.readArrayStart();i!=0;i=in.arrayNext()){
对于(int j=0;j
“write”方法似乎传递正确,但“read”方法在尝试读取字符串时因异常“java.lang.ArrayIndexOutOfBoundsException:36”而停止


我做错了什么以及如何正确地反序列化数据?

解决了我自己的问题:

如果有人需要,请将我的编码类放在此处:

public class ListUuidAsNullableListStringEncoding extends CustomEncoding<List<UUID>> {
    {
        schema = Schema.createUnion(
            Schema.create(Schema.Type.NULL),
            Schema.createArray(Schema.create(Schema.Type.STRING))
        );
    }

    @Override
    protected void write(Object datum, Encoder out) throws IOException {
        if (datum == null) {
            out.writeIndex(0);
            out.writeNull();
        } else {
            out.writeIndex(1);
            out.writeArrayStart();
            out.setItemCount(((List) datum).size());
            for (Object item : (List) datum) {
                if (item instanceof UUID) {
                    out.startItem();
                    out.writeString(item.toString());
                }
            }
            out.writeArrayEnd();
        }
    }

    @Override
    protected List<UUID> read(Object reuse, Decoder in) throws IOException {
        switch (in.readIndex()) {
            case 1:
                var newArray = new ArrayList<UUID>();

                for (long i = in.readArrayStart(); i != 0; i = in.arrayNext()) {
                    for (int j = 0; j < i; j++) {
                        newArray.add(UUID.fromString(in.readString()));
                    }
                }

                return newArray;
            default:
                in.readNull();
                return null;
        }
    }

}
公共类listuuidasnallableliststringencoding扩展了CustomEncoding{
{
schema=schema.createUnion(
Schema.create(Schema.Type.NULL),
Schema.createArray(Schema.create(Schema.Type.STRING))
);
}
@凌驾
受保护的无效写入(对象数据、编码器输出)引发IOException{
如果(基准==null){
out.writeIndex(0);
out.writeNull();
}否则{
外写索引(1);
out.writeArrayStart();
out.setItemCount(((列表)数据).size());
对于(对象项:(列表)基准){
如果(UUID的项目实例){
out.startItem();
out.writeString(item.toString());
}
}
out.writearlayend();
}
}
@凌驾
受保护列表读取(对象重用、解码器插入)引发IOException{
开关(在.readIndex()中){
案例1:
var newArray=newarraylist();
for(长i=in.readArrayStart();i!=0;i=in.arrayNext()){
对于(int j=0;j
我不认为
j
做了你认为是做的事,因为你在桶/节中循环“我”的实际意思。每个bucket/部分都包含一个bun/一堆您需要继续处理的项目。好吧,好吧,如果您解决了它,但是下面的答案,不是问题的答案我很惊讶这个问题/答案没有多少赞成票-我在其他任何地方都找不到这个信息