如果字段顺序更改,则Avro架构不兼容

时间:2017-08-24 04:21:45

标签: java schema avro

情景 - 客户端使用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只依赖于字段名来构建记录而不是订购。

对此有何修正?不同的客户可能有不同的订单,我无法强制执行排序,因为架构是通过反射生成的。

2 个答案:

答案 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;

所以,我认为这是正确的行为。