我正在閱讀有關(guān) Avro 的內(nèi)容,并且正在嘗試比較 avro 與 java 序列化系統(tǒng)。但不知怎的,我無法判斷為什么 avro 用于數(shù)據(jù)序列化而不是 java 序列化。事實(shí)上,為什么要出現(xiàn)另一個(gè)系統(tǒng)來取代java序列化系統(tǒng)呢?以下是我的理解的總結(jié)。要使用 java 序列化功能,我們必須使此類實(shí)現(xiàn)可序列化接口。如果您這樣做并序列化對象,那么在反序列化期間,類似e = (Employee) in.readObject();接下來我們可以使用 getter/setter 來處理員工對象。在 avro 中,首先是模式定義。接下來是使用 avro API 進(jìn)行序列化。再次關(guān)于反序列化,有類似的事情。接下來我們可以使用 getter/setter 來處理員工對象。問題是我沒有看到任何區(qū)別,只是使用它的 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()); }}接下來我們可以使用 getter/setter 來處理員工對象。問題是我沒有看到這兩種方法之間有任何區(qū)別。兩者都做同樣的事情。只是 API 不同嗎?誰能幫助我更好地理解這一點(diǎn)?
1 回答

慕田峪4524236
TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊
內(nèi)置的 java 序列化有一些相當(dāng)顯著的缺點(diǎn)。例如,如果不仔細(xì)考慮,您可能無法反序列化一個(gè)可能沒有更改數(shù)據(jù)、僅更改了類方法的對象。
您還可以創(chuàng)建一個(gè)情況,其中串行 uid 相同(手動(dòng)設(shè)置),但由于兩個(gè)系統(tǒng)之間的類型不兼容而實(shí)際上無法反序列化。
第三方序列化庫可以通過使用抽象映射將數(shù)據(jù)配對在一起來幫助緩解這種情況。精心設(shè)計(jì)的序列化庫甚至可以提供對象不同版本之間的映射。
最后,第三方序列化庫的錯(cuò)誤處理通常對開發(fā)人員或操作員更有用。
添加回答
舉報(bào)
0/150
提交
取消