2012-03-12 12 views
6

Trong Delphi, người ta có thể làm như sau:Viết trường hợp loại tùy ý vào một MemoryStream trong C#

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

này sẽ viết nội dung bộ nhớ của tôi vào ms.

Phiên bản .Net của MemoryStream không có tính năng như vậy (không phải phiên bản được quản lý cũng như không được quản lý). Tôi biết. Net không hoạt động trên cùng một nguyên tắc như Delphi trong lĩnh vực này.

Làm thế nào để thực hiện điều này trong C#? Tôi quan tâm đến "thực hành tốt nhất" và các phương pháp nhanh nhất.

+0

SizeOf() được xác định bởi trình biên dịch, không phải lúc chạy. Kiểu serialization này rất nhanh và đơn giản. – IamIC

Trả lời

4

Hãy thử bạn hát BinaryWriter trên đầu trang của MemoryStream:

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

Lưu ý: đừng quên để Vứt bỏ con suối và nhà văn/độc giả trong mã thực, tức là bằng using.

+0

Đây là một cái! Cảm ơn @Alexei. – IamIC

+0

Bạn quên liên kết luồng với người viết. –

+0

@HenkHolterman, cảm ơn - đã cập nhật. –

6

Bạn có thể Serialize đối tượng của bạn để một mảng byte

// 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; 
} 

Và sau đó sử dụng MemoryStream để viết nó như muốn

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

EDIT: Nếu bạn muốn viết một số nguyên, sử dụng

byte[] mData = BitConverter.GetBytes((UInt16)iInteger); 
memStream.write(mData, 0, mData.Length); 
+1

Cảm ơn. Đây là tuần tự hóa toàn bộ đối tượng, không chỉ là giá trị. Vì vậy, một số nguyên đang được lưu trữ dưới dạng 36 byte. Tôi chỉ muốn giá trị 4. – IamIC

2

Luồng .NET chỉ xử lý byte dữ liệu.

Để viết bất kỳ loại dữ liệu khác, bạn cần một 'endpiece':

  • BinaryWriter để viết giá trị nguyên thủy (int, double, string)
  • TextWriter viết char và đường dây, sử dụng một Encoding
  • Một Serializer (nhiều choicess) để viết đối tượng

Vì vậy, trong trường hợp của bạn:

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

cảm ơn bạn đã giải thích những gì cần sử dụng khi nào. Làm cho tinh thần với tôi bây giờ. – IamIC

Các vấn đề liên quan