我正在编写一个原型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中,如何将任何对象转换为字节数组?
发布于 2011-02-02 00:25:03
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
attribute标记,才能成功地用它序列化。
发布于 2013-08-13 17:15:40
查看本文:http://www.morgantechspace.com/2013/08/convert-object-to-byte-array-and-vice.html
使用以下代码
// 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;
}
发布于 2013-10-19 23:56:58
正如其他人之前所说的,您可以使用二进制序列化,但它可能会产生额外的字节,或者被反序列化为具有不完全相同数据的对象。另一方面,使用反射是非常复杂和缓慢的。还有另一种解决方案,可以严格地将对象转换为字节,反之亦然:
var size = Marshal.SizeOf(your_object);
// Both managed and unmanaged buffers required.
var bytes = new byte[size];
var ptr = Marshal.AllocHGlobal(size);
// Copy object byte-to-byte to unmanaged memory.
Marshal.StructureToPtr(your_object, ptr, false);
// Copy data from unmanaged memory to managed buffer.
Marshal.Copy(ptr, bytes, 0, size);
// Release unmanaged memory.
Marshal.FreeHGlobal(ptr);
并将字节转换为object:
var bytes = new byte[size];
var ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(bytes, 0, ptr, size);
var your_object = (YourType)Marshal.PtrToStructure(ptr, typeof(YourType));
Marshal.FreeHGlobal(ptr);
与您自己的逐个字段序列化相比,对小对象和小结构使用这种方法明显较慢,并且部分不安全(因为从非托管内存中复制/复制到非托管内存),但它是最简单的方法,可以在不实现序列化和没有Serializable属性的情况下严格地将对象转换为byte[]。
https://stackoverflow.com/questions/4865104
复制相似问题