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

本文关键字:实例 MemoryStream 类型 任意 | 更新日期: 2023-09-27 18:27:32

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

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

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

.Net版本的MemoryStream没有这样的功能(无论是托管版本还是非托管版本)。在这方面,我知道.Net的工作原理与Delphi不同。

在C#中如何做到这一点?我对"最佳实践"和最快的方法感兴趣。

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

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

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

尝试在MemoryStream之上使用BinaryWriter:

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

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

.NET流只处理byte数据。

要写入任何其他类型的数据,您需要一个"终端":

  • BinaryWriter,用于写入基元值(int、double、string)
  • TextWriter使用Encoding编写字符和行
  • 用于写入对象的序列化程序(多种选择)

所以在你的情况下:

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