一尘不染

将任何对象转换为字节[]

c#

我正在编写一个原型TCP连接,但在均匀化要发送的数据时遇到了一些麻烦。

目前,我只发送字符串,但是将来我们希望能够发送任何对象。

此刻的代码非常简单,因为我认为所有内容都可以转换为字节数组:

void SendData(object headerObject, object bodyObject)
{
  byte[] header = (byte[])headerObject;  //strings at runtime, 
  byte[] body = (byte[])bodyObject;      //invalid cast exception

  // Unable to cast object of type 'System.String' to type 'System.Byte[]'.
  ...
}

这当然很容易解决

if( state.headerObject is System.String ){...}

问题是,如果我这样做,我需要在运行时检查无法转换为byte []的每种类型的对象。

由于我不知道每个对象在运行时都不能转换为byte [],因此这实际上不是一个选择。

如何在C#.NET 4.0中将任何对象完全转换为字节数组?


阅读 188

收藏
2020-05-19

共1个答案

一尘不染

使用BinaryFormatter

byte[] ObjectToByteArray(object obj)
{
    if(obj == null)
        return null;
    BinaryFormatter bf = new BinaryFormatter();
    using (MemoryStream ms = new MemoryStream())
    {
        bf.Serialize(ms, obj);
        return ms.ToArray();
    }
}

请注意,obj其中的任何属性/字段obj(及其所有属性/字段都将如此)都需要标记为该Serializable属性,以便以此成功进行序列化。

2020-05-19