首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将任何对象转换为byte[]

将任何对象转换为byte[]
EN

Stack Overflow用户
提问于 2011-02-02 00:23:06
回答 9查看 283.8K关注 0票数 151

我正在编写一个原型TCP连接,我在同质化要发送的数据时遇到了一些问题。

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

目前代码非常简单,因为我认为所有内容都可以转换为一个字节数组:

代码语言:javascript
复制
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[]'.
  ...
}

当然,这很容易用一个

代码语言:javascript
复制
if( state.headerObject is System.String ){...}

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

因为我不知道不能在运行时转换为byte[]的所有对象,所以这真的不是一个选择。

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

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-02-02 00:25:03

使用BinaryFormatter

代码语言:javascript
复制
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();
    }
}

请注意,objobj中的任何属性/字段(以及它们的所有属性/字段等等)都需要用Serializable attribute标记,才能成功地用它序列化。

票数 212
EN

Stack Overflow用户

发布于 2013-08-13 17:15:40

查看本文:http://www.morgantechspace.com/2013/08/convert-object-to-byte-array-and-vice.html

使用以下代码

代码语言:javascript
复制
// 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;
}
票数 110
EN

Stack Overflow用户

发布于 2013-10-19 23:56:58

正如其他人之前所说的,您可以使用二进制序列化,但它可能会产生额外的字节,或者被反序列化为具有不完全相同数据的对象。另一方面,使用反射是非常复杂和缓慢的。还有另一种解决方案,可以严格地将对象转换为字节,反之亦然:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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[]。

票数 33
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4865104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档