從多個方面詳細闡述object轉byte數組

一、為什麼需要將object轉化為byte數組

在數據的傳輸和存儲過程中,我們常常需要將對象轉化為byte數組。這主要是因為在網絡傳輸、磁盤存儲、對象序列化等場景中,byte數組具有以下幾個優點:

1、在各種機器和系統之間傳輸數據的唯一通用方式就是將數據轉換成byte數組

2、byte數組在JAVA和.NET等主流編程語言中被廣泛的使用

3、更加靈活處理數據

示例代碼:

public static byte[] objectToByteArray(Object obj) throws IOException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    ObjectOutputStream os = new ObjectOutputStream(out);
    os.writeObject(obj);
    return out.toByteArray();
}

二、如何實現object轉byte數組

實現將object轉化為byte數組的方法基本上分為兩個方案:

1、使用Java序列化機制,將目標對象序列化為byte數組

2、手工編寫二進制轉換工具類,將目標對象按照特定的順序轉換為byte數組

使用第一個方案的好處是,無需考慮數據存儲結構和數據類型,因為Java序列化機制會自動處理這些問題。

另一方面,由於Java序列化機制是重量級的,一些對象序列化時會存在性能問題,例如大量的計算和IO連續讀寫。

示例代碼:

public static byte[] serialize(Object obj) throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(bos);
    oos.writeObject(obj);
    return bos.toByteArray();
}

三、如何反序列化byte數組為object

如果要將byte數組轉換回對象,必須將byte數組還原為原始的Java對象。

示例代碼:

public static Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
    ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
    ObjectInputStream ois = new ObjectInputStream(bis);
    return ois.readObject();
}

四、如何處理非序列化對象

在某些情況下,對象可能無法進行Java序列化,此時可以使用手工編寫的轉換工具類將對象轉換為byte數組。

示例代碼:

public static byte[] toByteArray(String s) {
    try {
        byte[] data = s.getBytes("ISO-8859-1");
        int len = data.length;
        byte[] out = new byte[len];
        for (int i = 0; i < len; i++) {
            out[i] = data[i];
        }
        return out;
    } catch (UnsupportedEncodingException e) {
        return null;
    }
}

五、如何處理序列化對象中的特殊情況

在某些情況下,序列化對象可能會遇到一些特殊情況,例如:

1、序列化的對象含有敏感信息,需要忽略這部分信息

2、序列化時出現循環應用,需要正常轉換

示例代碼:

public class CustomObjectOutputStream extends ObjectOutputStream {
    public CustomObjectOutputStream(OutputStream out) throws IOException {
        super(out);
    }
 
    @Override
    protected void writeStreamHeader() throws IOException {
        return;
    }
 
    @Override
    protected void writeClassDescriptor(ObjectStreamClass desc) throws IOException {
        return;
    }
}

六、遇到byte數組轉object卡頓咋辦

當byte數組非常大時,將byte數組轉化為object可能會非常耗時。

一種簡單的解決方法是,將byte數組分割成多個部分,然後逐步轉換為不同的object。

示例代碼:

public static List<Object> splitArray(Object[] array, int chunkSize) {
    List<Object> listOfArrays = new ArrayList<Object>();
    int totalSize = array.length;
    int offset = 0;
    while (totalSize > 0) {
        int length = Math.min(totalSize, chunkSize);
        Object subArray = Array.newInstance(array.getClass().getComponentType(), length);
        System.arraycopy(array, offset, subArray, 0, length);
        offset += length;
        totalSize -= length;
        listOfArrays.add(subArray);
    }
    return listOfArrays;
}

七、如何進行序列化和反序列化的性能測試

如何進行Java序列化和反序列化的性能測試?目前最常用的是使用jmh測試框架:JMH 是用於基準測試的 Java Microbenchmark Harness,是 OpenJDK 工具集的一部分,提供了簡單而強大的基準測試方法。它的使用方式類似JUnit,基於註解構建並運行測試。

示例代碼:

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Fork(value = 1, jvmArgs = {"-Xms2G", "-Xmx2G"})
@Warmup(iterations = 3)
@Measurement(iterations = 5, time = 5, timeUnit = TimeUnit.SECONDS)
public class SerializationTest {
 
    private static final byte[] DATA = createData();
    private static final Serializable OBJECT = new MyObject();
 
    private static byte[] createData() {
        Random random = new Random();
        byte[] data = new byte[1024 * 1024];
        random.nextBytes(data);
        return data;
    }
 
    @Benchmark
    public byte[] serialize() throws IOException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(OBJECT);
        return bos.toByteArray();
    }
 
    @Benchmark
    public Object deserialize() throws IOException, ClassNotFoundException {
        ByteArrayInputStream bis = new ByteArrayInputStream(serialize());
        ObjectInputStream ois = new ObjectInputStream(bis);
        return ois.readObject();
    }
}

原創文章,作者:BLKNA,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/325047.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
BLKNA的頭像BLKNA
上一篇 2025-01-13 13:23
下一篇 2025-01-13 13:23

相關推薦

  • 為什麼Python不能編譯?——從多個方面淺析原因和解決方法

    Python作為很多開發人員、數據科學家和計算機學習者的首選編程語言之一,受到了廣泛關注和應用。但與之伴隨的問題之一是Python不能編譯,這給基於編譯的開發和部署方式帶來不少麻煩…

    編程 2025-04-29
  • Python導入數組

    本文將為您詳細闡述Python導入數組的方法、優勢、適用場景等方面,並附上代碼示例。 一、numpy庫的使用 numpy是Python中一個強大的數學庫,其中提供了非常豐富的數學函…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • Python返回數組:一次性搞定多種數據類型

    Python是一種多用途的高級編程語言,具有高效性和易讀性的特點,因此被廣泛應用於數據科學、機器學習、Web開發、遊戲開發等各個領域。其中,Python返回數組也是一項非常強大的功…

    編程 2025-04-29
  • Python合併多個相同表頭文件

    對於需要合併多個相同表頭文件的情況,我們可以使用Python來實現快速的合併。 一、讀取CSV文件 使用Python中的csv庫讀取CSV文件。 import csv with o…

    編程 2025-04-29
  • Python去掉數組的中括號

    在Python中,被中括號包裹的數據結構是列表,列表是Python中非常常見的數據類型之一。但是,有些時候我們需要將列表展開成一維的數組,並且去掉中括號。本文將為大家詳細介紹如何用…

    編程 2025-04-29
  • Python操作數組

    本文將從多個方面詳細介紹如何使用Python操作5個數組成的列表。 一、數組的定義 數組是一種用於存儲相同類型數據的數據結構。Python中的數組是通過列表來實現的,列表中可以存放…

    編程 2025-04-29
  • 從多個方面用法介紹yes,but let me review and configure level of access

    yes,but let me review and configure level of access是指在授權過程中,需要進行確認和配置級別控制的全能編程開發工程師。 一、授權確…

    編程 2025-04-29
  • Python二維數組對齊輸出

    本文將從多個方面詳細闡述Python二維數組對齊輸出的方法與技巧。 一、格式化輸出 Python中提供了格式化輸出的方法,可以對輸出的字符串進行格式化處理。 names = [‘A…

    編程 2025-04-29
  • 從多個方面zmjui

    zmjui是一個輕量級的前端UI框架,它實現了豐富的UI組件和實用的JS插件,讓前端開發更加快速和高效。本文將從多個方面對zmjui做詳細闡述,幫助讀者深入了解zmjui,以便更好…

    編程 2025-04-28

發表回復

登錄後才能評論