当 java 提供 API 时,需要选择序列化框架吗?

What is the need to choose serializaiton frameworks, when java provides APIs to do it?

我正在阅读有关 Avro 的信息,我正在尝试比较 avro 与 java 序列化系统。但不知何故,我无法判断为什么 avro 用于数据序列化而不是 java 序列化。其实,为什么要换一个系统来代替java连载系统呢?

这里总结一下我的理解。 要使用 java 序列化功能,我们必须让这个 class 实现可序列化接口。如果你这样做并序列化对象,那么在反序列化过程中,类似于

e =(员工)in.readObject();

接下来我们可以使用 getters/setters 来处理员工对象。

在avro, 首先是模式定义。接下来是使用avro APIs 进行序列化。同样在反序列化中有这样的东西。

接下来我们可以使用 getters/setters 来处理员工对象。

问题是我没有看到任何区别,只是使用它的 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/setters 来处理员工对象。

问题是我看不出这两种方法有什么区别。两者做同样的事情。只是 API 不同?谁能帮助我更好地理解这一点?

内置的 java 序列化有一些非常明显的缺点。例如,如果不仔细考虑,您可能无法反序列化一个可能没有更改数据、仅更改 class 方法的对象。

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

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

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