2012-03-12 1 views
6

В Delphi, можно сделать следующее:Запись произвольных экземпляров типа в MemoryStream в C#

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#? Меня интересует «лучшая практика» и самые быстрые методы.

+0

РазмерОф() определяется компилятором, а не во время выполнения. Этот стиль сериализации невероятно быстрый и простой. – IamIC

ответ

4

Попробуйте u петь BinaryWriter на вершине MemoryStream:

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

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

+0

Это тот! Спасибо @Alexei. – IamIC

+0

Вы забыли связать поток с писателем. –

+0

@HenkHolterman, спасибо - обновлено. –

6

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

// 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); 
+1

Спасибо. Это сериализует весь объект, а не только значение. Таким образом, целое число хранится как 36 байт. Мне нужно только значение 4. – IamIC

2

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

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

  • BinaryWriter писать примитивные значения (INT, двойной, струнный)
  • TextWriter писать полукокс и линию, используя кодирование
  • сериализатор (многие choicess) писать объекты

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

var writer = new BinaryWriter(myStream); 
writer.Write(i); // writes 4 bytes only 
+0

Благодарим вас за разъяснение, что использовать когда. Теперь имеет смысл для меня. – IamIC