使用byte[] 数组存储object对象

使用byte[] 数组存储object对象

byte[] 是一种用于存储字节数据的数组,不能直接用来存储对象(Object)。

但是可以将一个对象序列化为字节数组,然后将这个字节数组存储在 byte[] 中。

序列化是将对象的状态转换为字节流的过程,而反序列化是将字节流转换回对象的过程。

如何将对象存储为 byte[]

你可以使用 Java 内置的序列化机制来实现这一点。具体步骤如下:

  1. 对象类实现 Serializable 接口: 使你的对象类实现 Serializable 接口,以便它能够被序列化。
  2. 将对象序列化为 byte[]: 使用 ObjectOutputStream 将对象写入 ByteArrayOutputStream,从而获得字节数组。
  3. byte[] 反序列化为对象: 使用 ObjectInputStreamByteArrayInputStream 中读取字节数据并将其转换回对象。

代码

以下示例演示如何将对象序列化为 byte[] 并反序列化回对象:

对象类

import java.io.Serializable;

public class MyObject implements Serializable {
    private static final long serialVersionUID = 1L;

    private String name;
    private int value;

    public MyObject(String name, int value) {
        this.name = name;
        this.value = value;
    }

    @Override
    public String toString() {
        return "MyObject{name='" + name + "', value=" + value + '}';
    }
}

序列化和反序列化方法

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class SerializationUtil {

    // 序列化对象为 byte[]
    public static byte[] serialize(Object obj) throws Exception {
        try (
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
             ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)
        ) {
            objectOutputStream.writeObject(obj);
            // try-with-resources写法,在try块结束会自动objectOutputStream.close();
            return byteArrayOutputStream.toByteArray();
        }
    }

    // 反序列化 byte[] 为对象
    public static Object deserialize(byte[] bytes) throws Exception {
        try (
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
             ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)
        ) {
            return objectInputStream.readObject();
        }
    }
}

测试序列化和反序列化

public class Main {
    public static void main(String[] args) {
        try {
            // 创建对象
            MyObject originalObject = new MyObject("example", 42);

            // 序列化对象
            byte[] serializedData = SerializationUtil.serialize(originalObject);
            System.out.println("Serialized data: " + java.util.Arrays.toString(serializedData));

            // 反序列化对象
            MyObject deserializedObject = (MyObject) SerializationUtil.deserialize(serializedData);
            System.out.println("Deserialized object: " + deserializedObject);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

结果

Serialized data: [ac, ed, 00, 05, 73, 72, 00, 09, 4d, 79, 4f, 62, 6a, 65, 63, 74, 00, 00, 00, 00, 00, 00, 00, 01, 02, 00, 02, 4c, 00, 04, 6e, 61, 6d, 65, 74, 00, 12, 4c, 6a, 61, 76, 61, 2f, 6c, 61, 6e, 67, 2f, 53, 74, 72, 69, 6e, 67, 3b, 49, 00, 05, 76, 61, 6c, 75, 65, 78, 70, 74, 00, 07, 65, 78, 61, 6d, 70, 6c, 65, 00, 00, 00, 2a]
Deserialized object: MyObject{name='example', value=42}
posted @ 2024-07-10 16:32  r涤生  阅读(35)  评论(0编辑  收藏  举报