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

Iam*_*mIC 6 .net c# serialization memorystream c#-4.0

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

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

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

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

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

Sha*_*hai 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;
}
Run Code Online (Sandbox Code Playgroud)

然后用MemoryStream它来按需编写它

byte[] mData = ObjectToByteArray(myObject);
MemoryStream memStream = new MemoryStream();
memStream.write(mData, 0, mData.Length);
Run Code Online (Sandbox Code Playgroud)

编辑:如果你想写一个整数,使用

byte[] mData = BitConverter.GetBytes((UInt16)iInteger);
memStream.write(mData, 0, mData.Length);
Run Code Online (Sandbox Code Playgroud)


Ale*_*kov 5

尝试在 MemoryStream 之上使用BinaryWriter

MemoryStream memoryStream = new MemoryStream(); 
BinaryWriter writer = new BinaryWriter(memoryStream);
writer.Write((int)123);
Run Code Online (Sandbox Code Playgroud)

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