在 Avro 中用数组序列化一个对象
Serialize an object with array in Avro
我需要将一个带有 Object[]
字段的对象序列化为字节数组,但是当我执行以下代码时,结果字节数组为空:
TestObject testObject = new TestObject();
ByteArrayOutputStream out = new ByteArrayOutputStream();
DatumWriter<TestObject> writer = new ReflectDatumWriter<TestObject>(TestObject.class);
final Encoder encoder = EncoderFactory.get().directBinaryEncoder(out, null);
writer.write(testObject, encoder);
out.close();
// This is empty
byte[] res = out.toByteArray();
其中 TestObject 是:
class TestObject {
Object[] arr = new Object[] {1, "str", false};
}
如果我将 TestObject 定义替换为:
class TestObject {
String str = "str";
}
它工作正常,我看到 String
字段已成功写入字节数组。
Avro 在序列化 Object[]
数组时有任何问题还是我使用不正确?
您的问题是生成的反射模式假定数组中的所有对象都是 Object 类型。
如果您希望它们是 Integer、String 或 Boolean,我认为您不能使用反射,而是自己定义模式。
例如,如果您的数组将是字符串,它 将 起作用。
我需要将一个带有 Object[]
字段的对象序列化为字节数组,但是当我执行以下代码时,结果字节数组为空:
TestObject testObject = new TestObject();
ByteArrayOutputStream out = new ByteArrayOutputStream();
DatumWriter<TestObject> writer = new ReflectDatumWriter<TestObject>(TestObject.class);
final Encoder encoder = EncoderFactory.get().directBinaryEncoder(out, null);
writer.write(testObject, encoder);
out.close();
// This is empty
byte[] res = out.toByteArray();
其中 TestObject 是:
class TestObject {
Object[] arr = new Object[] {1, "str", false};
}
如果我将 TestObject 定义替换为:
class TestObject {
String str = "str";
}
它工作正常,我看到 String
字段已成功写入字节数组。
Avro 在序列化 Object[]
数组时有任何问题还是我使用不正确?
您的问题是生成的反射模式假定数组中的所有对象都是 Object 类型。 如果您希望它们是 Integer、String 或 Boolean,我认为您不能使用反射,而是自己定义模式。 例如,如果您的数组将是字符串,它 将 起作用。