как привести enum к байтовому массиву в Java? - PullRequest
0 голосов
/ 12 июня 2018

Я хочу привести значение Enum к байтовому массиву в Java, я нашел следующий пост в StackOverflow:

Как привести enum к байтовому массиву?

Однако это не помогло.

Я хочу перебрать все элементы перечисления и привести их к байтовому массиву или к единому перечислению всего перечисления.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Может быть, это поможет

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

}
0 голосов
/ 12 июня 2018

Экземпляр, представленный в байтах, по сути является сериализацией, поэтому я думаю, вы могли бы просто пойти с этим

enum MyEnum implements Serializable {
    A
}

А для сериализации в byte[] вы можете пойти с этим источникомкод от 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();
    }
}

Таким образом, мы можем преобразовать байт []снова в экземпляр (осторожно с классом send, это может привести к некоторому исключению приведения

@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 не требуется, но я чувствую, что так безопаснее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...