【发布时间】: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 < i做你认为的事情 -
确实如此,因为您循环遍历存储桶/部分,“i”实际上是什么意思。每个桶/部分都包含一个小圆面包,一堆你需要继续的物品。
-
好吧,好吧,如果你解决了,但下面的答案,不是问题