我正在编写一个原型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中将任何对象完全转换为字节数组?
使用BinaryFormatter:
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属性,以便以此成功进行序列化。
obj
Serializable