当Java提供API时,选择序列化框架有什么需要?

时间:2019-09-20 18:43:39

标签: java serialization avro

我正在阅读有关Avro的内容,并且正在尝试比较Avro与Java序列化系统。但是以某种方式,我无法衡量为什么将avro用于数据序列化而不是java序列化。事实上,为什么要引入另一个系统来代替Java序列化系统?

这是我的理解的摘要。 要使用Java序列化功能,我们必须使此类实现可序列化的接口。如果您这样做并序列化了对象,那么在反序列化期间,类似

e =(Employee)in.readObject();

接下来,我们可以使用getters / setter方法来处理employee对象。

在avro中, 首先是架构定义。接下来是使用avro API进行序列化。再次进行反序列化时,会出现这样的情况。

接下来,我们可以使用getters / setter方法来处理employee对象。

问题是,我看不出有什么区别,只是使用它的API有所不同?有人可以澄清我的疑问吗?

public AvroHttpRequest deSerealizeAvroHttpRequestJSON(byte[] data) {
DatumReader<AvroHttpRequest> reader
     = new SpecificDatumReader<>(AvroHttpRequest.class);
    Decoder decoder = null;
    try {
        decoder = DecoderFactory.get().jsonDecoder(
          AvroHttpRequest.getClassSchema(), new String(data));
        return reader.read(null, decoder);
    } catch (IOException e) {
        logger.error("Deserialization error:" + e.getMessage());
    }}

接下来,我们可以使用getters / setter方法来处理employee对象。

问题是我认为这两种方法之间没有任何区别。两者都做同样的事情。只是API不同?谁能帮助我更好地理解这一点?

1 个答案:

答案 0 :(得分:1)

内置的Java序列化有一些明显的缺点。例如,如果没有仔细考虑,您可能无法反序列化可能没有对数据进行更改,仅对类的方法进行更改的对象。

您还可以创建一种情况,其中串行uid相同(手动设置),但由于两个系统之间的类型不兼容而实际上无法反序列化。

第三方序列化库可以通过使用抽象映射将数据配对在一起来帮助缓解这种情况。精心设计的序列化库甚至可以提供对象的不同版本之间的映射。

最后,对第三方序列化库的错误处理通常对于开发人员或操作员而言更为有用。