16.1.7 模式解析
无论从RPC还是从文件中获得Avro数据,由于模式已知,读者都可以解析数据,但是那个模式可能并不完全是所期望的模式。例如,如果数据写入的软件版本与读者不同,那么记录中的一些字段可能会增加或减少,这一部分将详述如何解决这种模式区别。
我们称用来写数据的模式为写者的模式,应用程序期望的模式为读者的模式。两个模式之间是否匹配可按照下面的规则进行判断。
1)如果两个模式符合以下情况之一则为匹配,否则为不匹配,并产生错误:
模式都是数组且项类型匹配。
模式都是映射且值类型匹配。
模式都是枚举且名称匹配。
模式都是固定型且大小和名称匹配。
模式都是记录且名称相同。
模式是其中之一为联合。
两个模式拥有相同的原始类型。
写者的模式可以提升为读者的模式,如下所示:
·int可以转化为long、float或者double;
·long可以转化为float或double;
·float可以转化为double。
2)如果两个都是记录,则:
字段的顺序可以不同,因为字段是通过名称来匹配的。
有相同名称字段的模式记录是递归解析的。
如果写者的记录中包含读者记录中没有的字段,那么写者字段的值将被忽略。
如果读者记录模式中有一个为默认值的字段,并且写者的模式中没有相同名称的字段,那么读者的这个字段应该使用默认值。
如果读者记录模式中有一个没有默认值的字段,并且写者的模式中没有相同名称的字段,那么将发出错误信号。
3)如果两个都是枚举,且写者的符号并不在读者的枚举中,那么产生错误。
4)如果两个都是数组,解析算法递归应用于读者和写者的数组项的模式。
5)如果两个都是映射,解析算法递归应用于读者和写者映射值的模式。
6)如果两个都是联合,对读者联合中匹配写者联合模式的第一个模式进行递归解析,如果没有匹配的,将产生错误。
7)如果读者为联合,而写者的不是,对读者联合中匹配所选写者模式的第一个模式进行递归解析,如果没有匹配的,将产生错误。
8)如果写者的是联合,读者的不是,且读者的模式匹配所选写者的模式,那么对它进行递归解析,如果它们不匹配,将产生错误。
模式解析时将忽略模式中协议说明的"doc"字段,因此,序列化时模式中的"doc"部分将被抛弃。