如何在Java中将枚举转换为字节数组?

时间:2018-06-12 11:52:20

标签: java arrays enums

我想将一个枚举值转换为Java中的字节数组,我在StackOverflow上找到了以下帖子:

How to cast enum to byte array?

然而,它没有帮助。

我想迭代枚举的所有元素并将它们转换为字节数组或者将整个枚举转换一次。

2 个答案:

答案 0 :(得分:0)

以字节为单位表示的实例基本上是一个序列化,所以我想你可以简单地使用

enum MyEnum implements Serializable {
    A
}

要序列化为byte[],您可以使用我已经改进的source code from Taylor Leese

这将允许我们序列化每个Serializable实例

public static byte[] serial(Serializable s) throws IOException {
    try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out = new ObjectOutputStream(bos)) {
        out.writeObject(s);
        out.flush();
        return bos.toByteArray();
    }
}

有了这个,我们可以再次将byte []转换为一个实例(小心发送类,这可能会抛出一些转换异常

@SuppressWarnings("unchecked")
public static <T extends Serializable> T unserial(byte[] b, Class<T> cl) throws IOException, ClassNotFoundException {
    try (ByteArrayInputStream bis = new ByteArrayInputStream(b)) {
        ObjectInput in = null;
        in = new ObjectInputStream(bis);
        return (T) in.readObject();
    }
}

我们可以测试一下:

public static void main(String[] args) throws Exception {
    byte[] serial = serial(Enum.A);
    Enum e = unserial(serial, Enum.class);

    System.out.println(e);
}

我们可以注意到enum始终可序列化,因此implements不是必需的,但我觉得这样更安全。

答案 1 :(得分:0)

也许这有帮助

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

public class Stackoverflow {

    public enum Test {
        TEST_1, TEST_2


    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        ObjectOutputStream objectOut = new ObjectOutputStream(bytes);

        for (Test testValue : Test.values()) {
            objectOut.writeObject(testValue);
        }

        byte[] result = bytes.toByteArray();

        // check result
        ObjectInputStream objectIn = new ObjectInputStream(new ByteArrayInputStream(result));
        System.out.println(((Test) objectIn.readObject()).name());
        System.out.println(((Test) objectIn.readObject()).name());
    }

}