国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

編解碼技術(shù)

fobnn / 1452人閱讀

摘要:基于提供的對(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ì)象輸入/輸出流 ObjectInputStreamObjectOutputStream, 可以直接把 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

相關(guān)文章

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

    摘要:現(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)行、高峰流...

    dunizb 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<