Запись экземпляров произвольного типа в MemoryStream в C # - PullRequest
6 голосов
/ 12 марта 2012

В Delphi можно сделать следующее:

var
  ms  : TMemoryStream;
  i   : Integer;
begin
  ms := TMemoryStream.Create;
  i := 1024;
  ms.Write(@i, SizeOf(Integer));
  ms.Free;
end;

Это запишет содержимое памяти i в мс.

.Net-версия MemoryStream не имеет такой функции (ни управляемая, ни неуправляемая версии). Я знаю, что .Net в этом отношении не работает на тех же принципах, что и Delphi.

Как это сделать в C #? Меня интересуют «лучшие практики» и самые быстрые методы.

Ответы [ 3 ]

7 голосов
/ 12 марта 2012

Вы можете Сериализировать ваш объект в байтовый массив

// Convert an object to a byte array
private byte[] ObjectToByteArray(Object obj)
{
    if(obj == null)
        return null;
    BinaryFormatter bf = new BinaryFormatter();
    MemoryStream ms = new MemoryStream();
    bf.Serialize(ms, obj);
    return ms.ToArray();
}

// Convert a byte array to an Object
private Object ByteArrayToObject(byte[] arrBytes)
{
    MemoryStream memStream = new MemoryStream();
    BinaryFormatter binForm = new BinaryFormatter();
    memStream.Write(arrBytes, 0, arrBytes.Length);
    memStream.Seek(0, SeekOrigin.Begin);
    Object obj = (Object) binForm.Deserialize(memStream);
    return obj;
}

А затем используйте MemoryStream, чтобы написать его как хотелось

byte[] mData = ObjectToByteArray(myObject);
MemoryStream memStream = new MemoryStream();
memStream.write(mData, 0, mData.Length);

EDIT: Если вы хотите написать целое число, используйте

byte[] mData = BitConverter.GetBytes((UInt16)iInteger);
memStream.write(mData, 0, mData.Length);
4 голосов
/ 12 марта 2012

Попробуйте использовать BinaryWriter поверх MemoryStream:

MemoryStream memoryStream = new MemoryStream(); 
BinaryWriter writer = new BinaryWriter(memoryStream);
writer.Write((int)123);

Примечание: не забудьте утилизировать потоки и средства записи / чтения в реальном коде, т. Е. using.

2 голосов
/ 12 марта 2012

.NET потоки имеют дело только с byte данными.

Чтобы записать любой другой тип данных, вам нужен «конец»:

  • BinaryWriter для записи примитивных значений (int, double, string)
  • TextWriter для записи символов и строк с использованием кодировки
  • Сериализатор (много вариантов) для записи объектов

Так в вашем случае:

var writer = new BinaryWriter(myStream);
writer.Write(i);  // writes 4 bytes only
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...