情景 - 客户端使用Avro Reflect Datum Writer序列化POJO并将GenericRecord写入文件。 通过反射获得的模式是这样的(注意排序A,B,D,C) -
// $yourvalue is previous dropdown value
if (mysqli_num_rows($result) > 0) {
// output data of each row
while($row_branch = mysqli_fetch_array($result)) {
if ($row_branch["0"] == $yourvalue)
$selected = "selected";
else
$selected = "";
$menu_branch .= "<option value='".$row_branch["0"]."' $selected>" .
$row_branch["0"]. "</option>";
}
}
echo $menu_branch;
代理读取文件并使用默认架构(注意排序 - A,B,C,D)以反序列化记录的子集(客户端保证具有这些字段)
{
"namespace": "storage.management.example.schema",
"type": "record",
"doc": "Example schema for testing",
"name": "Event",
"fields": [
....
....
{ "name": "A", "type": "string" },
{ "name": "B", "type": "string" },
{ "name": "D", "type": "string" },
{ "name": "C", "type": "string" },
....
....
]
}
问题: 使用上述子集模式进行反序列化会导致以下异常 -
{
"namespace": "storage.management.example.schema",
"type": "record",
"doc": "Example schema for testing",
"name": "Event",
"fields": [
{ "name": "A", "type": "string" },
{ "name": "B", "type": "string" },
{ "name": "C", "type": "string" },
{ "name": "D", "type": "string" }
]
}
但是,如果子集模式还指定了A,B,D,C顺序中的字段(与客户端模式相同),则反序列化成功
预计会出现这种情况吗?我虽然Avro只依赖于字段名来构建记录而不是订购。
对此有何修正?不同的客户可能有不同的订单,我无法强制执行排序,因为架构是通过反射生成的。
答案 0 :(得分:2)
字段的顺序可能不同:字段按名称匹配。 https://avro.apache.org/docs/1.8.1/spec.html .... 在您的第一个架构中,还有其他您尚未显示的字段
答案 1 :(得分:0)
预计会出现这种情况吗?
文档说&#34; A record is encoded by encoding the values of its fields in the order that they are declared.&#34;
所以,我认为这是正确的行为。