Encoding Avro对列表进行序列化和去序列化<;UUID>;
我无法理解如何将列表序列化为二进制格式并反序列化回列表。为此,我尝试使用CustomEncoding: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
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/一堆您需要继续处理的项目。好吧,好吧,如果您解决了它,但是下面的答案,不是问题的答案我很惊讶这个问题/答案没有多少赞成票-我在其他任何地方都找不到这个信息