在C#中将任意类型实例写入MemoryStream

时间:2012-03-12 07:47:50

标签: c# .net c#-4.0 serialization memorystream

在Delphi中,可以执行以下操作:

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

这会将i的内存内容写入ms。

MemoryStream的.Net版本没有这样的功能(托管版本和非托管版本)。我知道.Net在这方面与Delphi的原理不同。

如何在C#中执行此操作?我对“最佳实践”和最快的方法感兴趣。

3 个答案:

答案 0 :(得分:7)

您可以将对象序列化为字节数组

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

编辑: 如果要写整数,请使用

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

答案 1 :(得分:4)

尝试在MemoryStream之上使用BinaryWriter

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

注意:不要忘记在实际代码中处理流和编写器/阅读器,即using

答案 2 :(得分:2)

.NET流只处理byte数据。

要编写任何其他类型的数据,您需要一个“终端”:

  • BinaryWriter写原始值(int,double,string)
  • 使用编码
  • 编写字符和行的TextWriter
  • 用于编写对象的Serializer(很多选择)

所以在你的情况下:

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