亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

編解碼技術(shù)

fobnn / 1496人閱讀

摘要:基于提供的對象輸入輸出流和可以直接把對象作為可存儲的字節(jié)數(shù)組寫入文件也可以傳輸?shù)骄W(wǎng)絡(luò)上序列化的目的主要有兩個網(wǎng)絡(luò)傳輸對象持久化當(dāng)進行遠程跨進程服務(wù)調(diào)用時需要把被傳輸?shù)膶ο缶幋a為字節(jié)數(shù)組或者對象而當(dāng)遠程服務(wù)讀取到對象或字節(jié)數(shù)組時需要將其解碼為

基于 Java 提供的對象輸入/輸出流 ObjectInputStreamObjectOutputStream, 可以直接把 Java 對象作為可存儲的字節(jié)數(shù)組寫入文件, 也可以傳輸?shù)骄W(wǎng)絡(luò)上.

Java 序列化的目的主要有兩個:

網(wǎng)絡(luò)傳輸

對象持久化

當(dāng)進行遠程跨進程服務(wù)調(diào)用時, 需要把被傳輸?shù)?Java 對象編碼為字節(jié)數(shù)組或者 ByteBuffer 對象. 而當(dāng)遠程服務(wù)讀取到 ByteBuffer 對象或字節(jié)數(shù)組時, 需要將其解碼為發(fā)送時的 Java 對象. 這被稱為 Java 對象編解碼技術(shù).

Java 序列化缺點

Java 序列化僅僅是 Java 編解碼技術(shù)的一種, 由于它的種種缺陷, 衍生除了多種解碼器技術(shù)和框架.

無法跨語言

對于跨進程的服務(wù)調(diào)用, 服務(wù)提供者可能會使用 C++ 或其他語言開發(fā), 當(dāng)我們需要和其他語言交互時, 由于 Java 序列化技術(shù)是 Java 語言內(nèi)部的私有協(xié)議, 其他語言并不支持, 所以無法對其進行反序列化.

序列化后的碼流太大

下面我們通過一個實例看下 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);
    }
}

測試結(jié)果

The jdk serializable length is: 102
The byte array serializable length is: 20

測試結(jié)果令人震驚, 采用 JDK 序列化機制編碼后的二進制數(shù)組大小盡然是二進制編碼的 5.1 倍. 在同等情況下, 編碼后的字節(jié)數(shù)組越大, 存儲的時候就越占空間, 存儲的硬件成本就越高, 并且在網(wǎng)絡(luò)傳輸時更占帶寬, 導(dǎo)致系統(tǒng)的吞吐量降低.

序列化性能太低

可以讓創(chuàng)建代碼循環(huán) 100 萬次, 然后在前后加入獲取系統(tǒng)時間.

業(yè)界主流的編解碼框架 Google 的 Protobuf 介紹

Protobuf 全稱 Google Protocole Buffers, 它由谷歌開源而來, 在谷歌內(nèi)部久經(jīng)考驗. 它將數(shù)據(jù)結(jié)構(gòu)以 .proto 文件進行描述, 通過代碼生成工具可以生成對應(yīng)數(shù)據(jù)結(jié)構(gòu)的 POJO 對象和 Protobuf 相關(guān)的屬性和方法.

它的特點如下.

結(jié)構(gòu)化數(shù)據(jù)存儲格式(XML JSON等);

高效的編解碼性能;

語言無關(guān)、平臺無關(guān)、擴展性好;

官方支持 Java、C++ 和 Python 三種語言.

為什么不使用 xml. 盡管 xml 的可讀性和可擴展性非常好, 也非常適合描述數(shù)據(jù)結(jié)構(gòu), 但是 xml 解析的時間開銷和 xml 為了可讀性而犧牲的空間開銷都非常大, 因此不適合做高性能的通信協(xié)議. Protobuf 使用二進制編碼, 在空間和性能上具有更大的優(yōu)勢.

Protobuf 另一個比較吸引人的地方就是它的 數(shù)據(jù)描述文件和代碼生成機制, 利用數(shù)據(jù)描述文件對數(shù)據(jù)結(jié)構(gòu)進行說明的優(yōu)點如下.

文本化的數(shù)據(jù)結(jié)構(gòu)描述語言, 可以實現(xiàn)語言和平臺無關(guān), 特別適合異構(gòu)系統(tǒng)間的集成.

通過標(biāo)識字段的順序, 可以實現(xiàn)協(xié)議的前向兼容;

自動代碼生成, 不需要手工編寫同樣數(shù)據(jù)結(jié)構(gòu)的 C++ 和 Java 版本;

方便后續(xù)的管理和維護. 相比于代碼, 結(jié)構(gòu)化的文檔更容易管理和維護.

總結(jié)

我們判斷一個編碼器框架的優(yōu)劣時, 往往會考慮以下幾個因素.

是否支持跨語言, 支持的語言種類是否豐富;

編碼后的碼流大小;

編解碼的性能;

類庫是否小巧, API 使用是否方便;

使用者需要手工開發(fā)的工作量和難度.

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/72768.html

相關(guān)文章

  • GPU云服務(wù)器的應(yīng)用場景

    摘要:現(xiàn)在我們通常聊到的云服務(wù)器指的是云服務(wù)器,這也是目前應(yīng)用范圍最廣的云產(chǎn)品。但是我們也能看到云服務(wù)器存在的缺陷。這在一般用戶看來是極高配置的云服務(wù)器在頂級用戶看來只是將將滿足需求。本文主要是聊聊云服務(wù)器的應(yīng)用場景。 現(xiàn)在我們通常聊到的云服務(wù)器指的是ECS云服務(wù)器,這也是目前應(yīng)用范圍最廣的云產(chǎn)品。ECS云服務(wù)器自出現(xiàn)開始,其具有的彈性伸縮、高可用性等特性滿足了網(wǎng)站建設(shè)、企業(yè)應(yīng)用運行、高峰流...

    dunizb 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<