Я сделал некоторые исследования по этой теме и нашел некоторые решения, с помощьюПреобразовать объект класса в байтах и создать объект из байтов
- MemoryStream и BinaryFormatter классы
- Marshal класса
Но ни один из этих методов не работает для моего класса, потому что у моих классов есть массив.
Вот тестовый класс я работаю с:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public class ByteArrayInClass
{
private byte _option;
private ushort _nElements;
private byte[] arrayElements;
public ByteArrayInClass(byte option, ushort nElements)
{
this._option = option;
this._nElements = nElements;
arrayElements = new byte[nElements];
for (int i = 0; i < arrayElements.Length; i++)
{
arrayElements[i] = (byte)i;
}
}
public static byte[] ObjectToBytes(byteArrayInClass value)
{
}
public static byteArrayInClass BytesToObject(byte[] bytes)
{
}
}
В моем главном:
testObject1 = new ByteArrayInClass(3, 10);
byte[] testBytes1 = ByteArrayInClass.ObjectToBytes(testObject1);
byte[] testBytes2 = { 3, 10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
ByteArrayInClass testObject2 = ByteArrayInClass.BytesToObjectbyte(testBytes2);
Я начинаю думать, что мне нужно, чтобы преобразовать член класса в байты одного по одному, и наоборот для преобразования байтов в объект. Может ли кто-нибудь указать мне в правильном направлении?
Редактировать: Я не был достаточно ясен о том, что я пытаюсь сделать. Я работаю над программой, которая общается с сервером. Он включает в себя получение данных и отправку данных. Данные отправляются и принимаются в байтах, и когда я получаю байты данных, мне нужно построить класс с полученными байтами, поэтому я понимаю, что отправляется мне. Когда я отправляю данные на сервер, сначала создаю класс с соответствующими значениями, а затем конвертирую объект в байты, поэтому я могу отправить данные на сервер. Надеюсь, это объяснит немного лучше, что я пытаюсь сделать.
Похоже, что нет простого способа преобразования класса в байты, поэтому я сам преобразую каждый класс в байты. Итак, вот что я придумал. Пожалуйста, не стесняйтесь, дайте мне знать, если это глупый способ выполнить задачу. Я хотел бы изучить более умный способ сделать это.
public static int GetObjectSize(ByteArrayInClass value)
{
return Marshal.SizeOf(value.Option) + Marshal.SizeOf(value.ElementCount) + (value.ElementCount * 1);
}
public static byte[] ObjectToBytes(ByteArrayInClass value)
{
int copyIndex = 0;
byte[] resultBytes = new byte[GetObjectSize(value)];
resultBytes[copyIndex] = value.Option;
copyIndex += 1;
byte[] elementCountBytes = BitConverter.GetBytes(value.ElementCount);
elementCountBytes.CopyTo(resultBytes, copyIndex);
copyIndex += elementCountBytes.Length;
value.ElementArray.CopyTo(resultBytes, copyIndex);
return resultBytes;
}
public static ByteArrayInClass BytesTObject(byte[] bytes)
{
int convertIndex = 0;
byte option = bytes[convertIndex];
convertIndex += 1;
ushort elementCount = BitConverter.ToUInt16(bytes, convertIndex);
convertIndex += 2;
ByteArrayInClass resultObj = new ByteArrayInClass(option, elementCount);
byte[] elementArray = new byte[elementCount];
int j = 0;
for (int i = convertIndex; i < (convertIndex + elementCount); i++)
{
elementArray[j++] = bytes[i];
}
resultObj.ElementArray = elementArray;
return resultObj;
}
Массив байтов не должен быть проблемой. Почему вы используете атрибут «StructLayout» и пытаетесь ли вы сериализовать и деириализовать без него? Обычно такие объекты помечены атрибутом '[Serializable]'.См. Здесь: http://msdn.microsoft.com/en-us/library/4abbf6k0(v=vs.110).aspx –
У меня возникли проблемы с попыткой понять вашу цель, вы пытаетесь преобразовать байты в свой класс и наоборот? –
Код, который вы утверждаете, «ни один из этих методов не работает для моего класса», как-то отсутствует в сообщении. Обязательно добавьте эту часть из кода в образец. Трудно понять, почему код не работает. –