Ali*_*ziz 5 java serialization avro deserialization
我试图了解应该如何使用avro的逻辑类型。首先,让我举例说明我要达到的目标。我想写一个新的Logical Type(RegExLogicalType)来验证输入字符串并接受它或引发一些异常。
或让我们说说我期望以这种方式使用的现有受支持的avro逻辑类型(十进制)之一:
org.apache.avro.AvroRuntimeException: Field test_decimal type:BYTES pos:2 not set and has no default value我在文档中找到的只是谈论读/反序列化,而我不知道写/反序列化
语言实现在读取时必须忽略未知的逻辑类型,并应使用基础的Avro类型。如果逻辑类型无效,例如小数位数大于其精度的小数位数,则实现应忽略该逻辑类型并使用基础的Avro类型。
我不希望上面提到的序列化/反序列化行为,我需要有一些与XSD限制(模式)等效的东西,用于根据模式验证数据
如果架构如下,则显示在avro中
{"namespace": "com.stackoverflow.avro",
"type": "record",
"name": "Request",
"fields": [
{"name": "caller_jwt", "type": "string", "logicalType": "regular-expression", "pattern": "[a-zA-Z0-9]*\\.[a-zA-Z0-9]*\\.[a-zA-Z0-9]*"},
{"name": "test_decimal", "type": "bytes", "logicalType": "decimal", "precision": 4, "scale": 2}
]
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试构建一个对象并将其序列化为:
DatumWriter<Request> userDatumWriter = new SpecificDatumWriter<>(Request.class);
DataFileWriter<Request> dataFileWriter = new DataFileWriter<>(userDatumWriter);
ByteBuffer badDecimal = ByteBuffer.wrap("bad".getBytes());
Request request = Request.newBuilder()
.setTestDecimal(badDecimal) // bad decimal
.setCallerJwt("qsdsqdqsd").build(); // bad value according to regEx
dataFileWriter.create(request.getSchema(), new File("users.avro"));
dataFileWriter.append(dcCreationRequest);
dataFileWriter.close();
Run Code Online (Sandbox Code Playgroud)
没有异常被抛出,对象被序列化到users.avro文件
所以我不知道avro的逻辑类型是否可以用于验证输入数据?还是可以使用其他方法来验证输入数据?