【问题标题】:Avro serialize and desiaralize List<UUID>Avro 序列化和反序列化 List<UUID>
【发布时间】:2018-09-11 21:14:00
【问题描述】:

我无法理解如何将 List 序列化为二进制格式并反序列化回 List。为此,我尝试使用 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;
    }

}

'write' 方法似乎正确传递,但 'read' 方法在尝试读取字符串时因异常 'java.lang.ArrayIndexOutOfBoundsException: 36' 而停止。

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

【问题讨论】:

  • 我不认为j &lt; i 做你认为的事情
  • 确实如此,因为您循环遍历存储桶/部分,“i”实际上是什么意思。每个桶/部分都包含一个小圆面包,一堆你需要继续的物品。
  • 好吧,好吧,如果你解决了,但下面的答案,不是问题

标签: encoding avro


【解决方案1】:

自己解决了:

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

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;
        }
    }

}

【讨论】:

  • 我很惊讶这个问题/答案如此之少的正面投票 - 我在其他任何地方都找不到此信息
猜你喜欢
  • 2016-08-18
  • 2013-09-23
  • 2020-03-04
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
相关资源
最近更新 更多