首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C#中将对象转换为字节数组

如何在C#中将对象转换为字节数组
EN

Stack Overflow用户
提问于 2009-09-19 03:58:43
回答 7查看 220.2K关注 0票数 119

我有一个需要写入二进制文件的对象集合。

我需要文件中的字节是紧凑的,所以我不能使用BinaryFormatterBinaryFormatter为反序列化需求提供了各种信息。

如果我尝试

代码语言:javascript
复制
byte[] myBytes = (byte[]) myObject 

我得到了一个运行时异常。

我需要速度快,所以我不想复制字节数组。我只希望byte[] myBytes = (byte[]) myObject的角色能正常工作!

为了清楚起见,我不能在输出文件中包含任何元数据。只有对象字节。打包的对象到对象。根据收到的答案,看起来我将编写低级Buffer.BlockCopy代码。也许使用了不安全的代码。

EN

回答 7

Stack Overflow用户

发布于 2012-05-09 00:47:25

要将对象转换为字节数组,请执行以下操作:

代码语言:javascript
复制
// Convert an object to a byte array
public static byte[] ObjectToByteArray(Object obj)
{
    BinaryFormatter bf = new BinaryFormatter();
    using (var ms = new MemoryStream())
    {
        bf.Serialize(ms, obj);
        return ms.ToArray();
    }
}

您只需将此函数复制到您的代码中,并将需要转换为字节数组的对象发送给它。如果您需要再次将字节数组转换为对象,可以使用以下函数:

代码语言:javascript
复制
// Convert a byte array to an Object
public static Object ByteArrayToObject(byte[] arrBytes)
{
    using (var memStream = new MemoryStream())
    {
        var binForm = new BinaryFormatter();
        memStream.Write(arrBytes, 0, arrBytes.Length);
        memStream.Seek(0, SeekOrigin.Begin);
        var obj = binForm.Deserialize(memStream);
        return obj;
    }
}

您可以将这些函数与自定义类一起使用。您只需在类中添加[Serializable]属性即可启用序列化

票数 205
EN

Stack Overflow用户

发布于 2009-09-18 20:14:42

如果您希望序列化数据真正紧凑,您可以自己编写序列化方法。这样你就有了最小的开销。

示例:

代码语言:javascript
复制
public class MyClass {

   public int Id { get; set; }
   public string Name { get; set; }

   public byte[] Serialize() {
      using (MemoryStream m = new MemoryStream()) {
         using (BinaryWriter writer = new BinaryWriter(m)) {
            writer.Write(Id);
            writer.Write(Name);
         }
         return m.ToArray();
      }
   }

   public static MyClass Desserialize(byte[] data) {
      MyClass result = new MyClass();
      using (MemoryStream m = new MemoryStream(data)) {
         using (BinaryReader reader = new BinaryReader(m)) {
            result.Id = reader.ReadInt32();
            result.Name = reader.ReadString();
         }
      }
      return result;
   }

}
票数 50
EN

Stack Overflow用户

发布于 2014-01-25 05:21:49

我采用了Crystalonics的答案,并将它们转换为扩展方法。我希望其他人会发现它们很有用:

代码语言:javascript
复制
public static byte[] SerializeToByteArray(this object obj)
{
    if (obj == null)
    {
        return null;
    }
    var bf = new BinaryFormatter();
    using (var ms = new MemoryStream())
    {
        bf.Serialize(ms, obj);
        return ms.ToArray();
    }
}

public static T Deserialize<T>(this byte[] byteArray) where T : class
{
    if (byteArray == null)
    {
        return null;
    }
    using (var memStream = new MemoryStream())
    {
        var binForm = new BinaryFormatter();
        memStream.Write(byteArray, 0, byteArray.Length);
        memStream.Seek(0, SeekOrigin.Begin);
        var obj = (T)binForm.Deserialize(memStream);
        return obj;
    }
}
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1446547

复制
相关文章

相似问题

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