【问题标题】:how to cast enum to byte array in Java?如何在Java中将枚举转换为字节数组?
【发布时间】:2018-06-12 11:52:19
【问题描述】:

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

How to cast enum to byte array?

但是,它没有帮助。

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

【问题讨论】:

  • 这种演员阵容的作用没有标准定义。你的意思是你想要每个枚举的名称(没有类型名称)作为 UTF-8 编码中的 byte[] 的值吗?
  • 将类转换为 byte[] 是什么意思?你可以得到这个类的字节码。
  • 如何将字节数组转换回枚举实例?对此的答案可能会导致如何从枚举转换为字节数组
  • 我猜你可以尝试序列化枚举...但是为什么呢?
  • 您如何设想这样的演员阵容?枚举和字节数组之间的关系就像鱼和飞机之间的关系。如果您解释 whatwhy,特别是给出更大的图景,我们或许能够理解您的要求。

标签: java arrays enums


【解决方案1】:

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

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 不是必需的,但我觉得这样更安全。

【讨论】:

    【解决方案2】:

    也许这有帮助

    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());
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 2021-03-10
      • 2021-05-07
      • 1970-01-01
      相关资源
      最近更新 更多