摘要:基于提供的對(duì)象輸入輸出流和可以直接把對(duì)象作為可存儲(chǔ)的字節(jié)數(shù)組寫(xiě)入文件也可以傳輸?shù)骄W(wǎng)絡(luò)上序列化的目的主要有兩個(gè)網(wǎng)絡(luò)傳輸對(duì)象持久化當(dāng)進(jìn)行遠(yuǎn)程跨進(jìn)程服務(wù)調(diào)用時(shí)需要把被傳輸?shù)膶?duì)象編碼為字節(jié)數(shù)組或者對(duì)象而當(dāng)遠(yuǎn)程服務(wù)讀取到對(duì)象或字節(jié)數(shù)組時(shí)需要將其解碼為
基于 Java 提供的對(duì)象輸入/輸出流 ObjectInputStream 和 ObjectOutputStream, 可以直接把 Java 對(duì)象作為可存儲(chǔ)的字節(jié)數(shù)組寫(xiě)入文件, 也可以傳輸?shù)骄W(wǎng)絡(luò)上.
Java 序列化的目的主要有兩個(gè):
網(wǎng)絡(luò)傳輸
對(duì)象持久化
當(dāng)進(jìn)行遠(yuǎn)程跨進(jìn)程服務(wù)調(diào)用時(shí), 需要把被傳輸?shù)?Java 對(duì)象編碼為字節(jié)數(shù)組或者 ByteBuffer 對(duì)象. 而當(dāng)遠(yuǎn)程服務(wù)讀取到 ByteBuffer 對(duì)象或字節(jié)數(shù)組時(shí), 需要將其解碼為發(fā)送時(shí)的 Java 對(duì)象. 這被稱(chēng)為 Java 對(duì)象編解碼技術(shù).
Java 序列化缺點(diǎn)Java 序列化僅僅是 Java 編解碼技術(shù)的一種, 由于它的種種缺陷, 衍生除了多種解碼器技術(shù)和框架.
無(wú)法跨語(yǔ)言對(duì)于跨進(jìn)程的服務(wù)調(diào)用, 服務(wù)提供者可能會(huì)使用 C++ 或其他語(yǔ)言開(kāi)發(fā), 當(dāng)我們需要和其他語(yǔ)言交互時(shí), 由于 Java 序列化技術(shù)是 Java 語(yǔ)言?xún)?nèi)部的私有協(xié)議, 其他語(yǔ)言并不支持, 所以無(wú)法對(duì)其進(jìn)行反序列化.
序列化后的碼流太大下面我們通過(guò)一個(gè)實(shí)例看下 Java 序列化后的字節(jié)數(shù)組大小.
public class UserInfo implements Serializable { private static final long serialVersionUID = 1L; private String userName; private int userID; public byte[] codeC() { ByteBuffer buffer = ByteBuffer.allocate(1024); byte[] value = this.userName.getBytes(); buffer.put(value); buffer.putInt(this.userID); buffer.flip(); value = null; byte[] result = new byte[buffer.remaining()]; buffer.get(result); return result; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public int getUserID() { return userID; } public void setUserID(int userID) { this.userID = userID; } }
public class App { public static void main( String[] args ) throws Exception { UserInfo userInfo = new UserInfo(); userInfo.setUserID(100); userInfo.setUserName("Welcome to Netty"); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(userInfo); objectOutputStream.flush(); objectOutputStream.close(); byte[] bytes = byteArrayOutputStream.toByteArray(); System.out.println("The jdk serializable length is: " + bytes.length); System.out.println("The byte array serializable length is: " + userInfo.codeC().length); } }
測(cè)試結(jié)果
The jdk serializable length is: 102 The byte array serializable length is: 20
測(cè)試結(jié)果令人震驚, 采用 JDK 序列化機(jī)制編碼后的二進(jìn)制數(shù)組大小盡然是二進(jìn)制編碼的 5.1 倍. 在同等情況下, 編碼后的字節(jié)數(shù)組越大, 存儲(chǔ)的時(shí)候就越占空間, 存儲(chǔ)的硬件成本就越高, 并且在網(wǎng)絡(luò)傳輸時(shí)更占帶寬, 導(dǎo)致系統(tǒng)的吞吐量降低.
序列化性能太低可以讓創(chuàng)建代碼循環(huán) 100 萬(wàn)次, 然后在前后加入獲取系統(tǒng)時(shí)間.
業(yè)界主流的編解碼框架 Google 的 Protobuf 介紹Protobuf 全稱(chēng) Google Protocole Buffers, 它由谷歌開(kāi)源而來(lái), 在谷歌內(nèi)部久經(jīng)考驗(yàn). 它將數(shù)據(jù)結(jié)構(gòu)以 .proto 文件進(jìn)行描述, 通過(guò)代碼生成工具可以生成對(duì)應(yīng)數(shù)據(jù)結(jié)構(gòu)的 POJO 對(duì)象和 Protobuf 相關(guān)的屬性和方法.
它的特點(diǎn)如下.
結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)格式(XML JSON等);
高效的編解碼性能;
語(yǔ)言無(wú)關(guān)、平臺(tái)無(wú)關(guān)、擴(kuò)展性好;
官方支持 Java、C++ 和 Python 三種語(yǔ)言.
為什么不使用 xml. 盡管 xml 的可讀性和可擴(kuò)展性非常好, 也非常適合描述數(shù)據(jù)結(jié)構(gòu), 但是 xml 解析的時(shí)間開(kāi)銷(xiāo)和 xml 為了可讀性而犧牲的空間開(kāi)銷(xiāo)都非常大, 因此不適合做高性能的通信協(xié)議. Protobuf 使用二進(jìn)制編碼, 在空間和性能上具有更大的優(yōu)勢(shì).
Protobuf 另一個(gè)比較吸引人的地方就是它的 數(shù)據(jù)描述文件和代碼生成機(jī)制, 利用數(shù)據(jù)描述文件對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行說(shuō)明的優(yōu)點(diǎn)如下.
文本化的數(shù)據(jù)結(jié)構(gòu)描述語(yǔ)言, 可以實(shí)現(xiàn)語(yǔ)言和平臺(tái)無(wú)關(guān), 特別適合異構(gòu)系統(tǒng)間的集成.
通過(guò)標(biāo)識(shí)字段的順序, 可以實(shí)現(xiàn)協(xié)議的前向兼容;
自動(dòng)代碼生成, 不需要手工編寫(xiě)同樣數(shù)據(jù)結(jié)構(gòu)的 C++ 和 Java 版本;
方便后續(xù)的管理和維護(hù). 相比于代碼, 結(jié)構(gòu)化的文檔更容易管理和維護(hù).
總結(jié)我們判斷一個(gè)編碼器框架的優(yōu)劣時(shí), 往往會(huì)考慮以下幾個(gè)因素.
是否支持跨語(yǔ)言, 支持的語(yǔ)言種類(lèi)是否豐富;
編碼后的碼流大小;
編解碼的性能;
類(lèi)庫(kù)是否小巧, API 使用是否方便;
使用者需要手工開(kāi)發(fā)的工作量和難度.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/72768.html
摘要:現(xiàn)在我們通常聊到的云服務(wù)器指的是云服務(wù)器,這也是目前應(yīng)用范圍最廣的云產(chǎn)品。但是我們也能看到云服務(wù)器存在的缺陷。這在一般用戶(hù)看來(lái)是極高配置的云服務(wù)器在頂級(jí)用戶(hù)看來(lái)只是將將滿(mǎn)足需求。本文主要是聊聊云服務(wù)器的應(yīng)用場(chǎng)景。 現(xiàn)在我們通常聊到的云服務(wù)器指的是ECS云服務(wù)器,這也是目前應(yīng)用范圍最廣的云產(chǎn)品。ECS云服務(wù)器自出現(xiàn)開(kāi)始,其具有的彈性伸縮、高可用性等特性滿(mǎn)足了網(wǎng)站建設(shè)、企業(yè)應(yīng)用運(yùn)行、高峰流...
閱讀 1677·2021-11-17 09:33
閱讀 3541·2021-11-16 11:40
閱讀 3063·2019-08-30 11:23
閱讀 1054·2019-08-29 16:36
閱讀 2472·2019-08-29 13:23
閱讀 1746·2019-08-29 12:59
閱讀 1549·2019-08-29 12:42
閱讀 1986·2019-08-28 18:22