#java #serialization #bytearray
#java #сериализация #массивы
Вопрос:
Позвольте мне создать простой класс
public class A
{
public int a;
public int b;
public byte c;
public byte d;
public B e;
public C f;
public byte[] g = new byte[5];
}
Есть ли способ преобразовать его в байтовый массив, не делая это вручную? Требуется тот же порядок полей в результирующем массиве, и никакая другая информация в байтовом массиве не допускается, только значения полей.
Комментарии:
1. Я бы предположил, что отражение, но сначала: зачем вам это делать?
2. Если вы хотите использовать класс как структуру, то это сложно. Вы можете использовать отражение для получения полей, но нет никаких гарантий порядка.
3. Вы уверены, что вам просто не нужно его сериализовать? Для чего нужен массив, который вы создадите? Если это просто сериализация / десериализация, используйте стандартный ObjectOutputStream / ObjectInputStreams
4. У меня есть байтовый протокол с приложением C , который преобразует эти байты непосредственно в структуру C.
5. @Juvanis, почему вы изменили смысл вопроса?
Ответ №1:
Если вы хотите использовать отражение, у вас нет никаких гарантий в отношении порядка извлекаемых полей.
Таким образом, вы можете использовать два подхода:
- Лексический порядок полей
- Добавьте аннотацию к каждому полю с порядком этого поля в сериализации
Обратите внимание, что для сериализации массива вы должны знать длину массива или использовать разделитель для обозначения конца массива. В простом случае вашего примера это не требуется, потому что у вас есть только 1 массив. Это становится необходимым, если у вас есть более одной переменной переменной длины (например, строка или массив).
Если вам нужно разделить эти данные между вашим кодом и внешним кодом, вы должны быть уверены, что ваш процесс сериализации равен процессу сериализации внешней программы. Это означает, например, знать, представлен ли an int
как BigEndian
или нет.