我需要通过流发送数据,因此我选择Avro进行数据序列化和反序列化。但是使用avro阅读器的现有实现并不支持向后兼容性。将序列化数据写入文件并从文件读取支持向后兼容性。如何在不了解编写器架构的情况下实现向后兼容性。我发现了许多与此相关的stackoverflow问题。但我没有找到解决这个问题的方法。有人可以帮我解决这个问题。
以下是我的序列化程序和反序列化方法。
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle" />
</item>
<item
android:bottom="300dp"
android:left="-100dp"
android:right="-100dp"
android:top="-80dp">
<shape android:shape="oval">
<size android:height="20dp" />
<gradient
android:angle="0"
android:centerColor="@color/colorAccent"
android:endColor="@color/red"
android:startColor="@color/colorPrimary"
android:type="linear" />
</shape>
</item>
</layer-list>
答案 0 :(得分:1)
您可能必须定义要寻找向后兼容性的范围。您是否期望添加新属性?或者你要删除任何属性?要处理这两种情况,可以使用不同的选项。
如confluent blog所述,可以实现新属性的添加,并且可以向后兼容avro序列化/反序列化活动,您必须为新属性指定default
值。像下面的东西
{"name": "size", "type": "string", "default": "XL"}
另一个选项是指定reader and writer schemas exclusively。但正如您的问题所述,它似乎不是您正在寻找的选项。
如果您打算删除某个属性,可以继续解析该属性,但不要在应用程序中使用它。请注意,这必须在一定时间内发生,并且在您完全退出属性之前,必须给予消费者足够的时间来更改其程序。确保记录一个语句以指示在不应该发送属性时找到该属性(或者更好地向客户端系统发送带有警告的通知)。
除了以上几点,还有一个很好的博客讨论backward/forward compatibility。
答案 1 :(得分:0)
向后兼容意味着您可以使用较旧的架构对数据进行编码,并且知道最新架构的读者仍可以对数据进行解码。
Explanation from Confluent's website
因此,为了向后兼容解码Avro数据,您的阅读器需要访问最新的架构。例如,可以使用架构注册表来完成此操作。