C# 将对象数组强制转换为字节数组

C# 将对象数组强制转换为字节数组,c#,C#,我有一个对象数组,其中包含编译时未知的不同类型的数组,但结果是int[],double[]等 我想将这些数组保存到磁盘上,并且我实际上不需要在线处理它们的内容,因此我正在寻找一种方法,将对象[]转换为字节[],然后我可以将其写入磁盘 我如何才能做到这一点?来自: 您可以对类型使用二进制 编辑:如果数组的所有这些元素都是简单类型,则使用位转换器 object[] arr = { 10.20, 1, 1.2f, 1.4, 10L, 12 }; using (MemoryStream ms = new

我有一个对象数组,其中包含编译时未知的不同类型的数组,但结果是
int[]
double[]

我想将这些数组保存到磁盘上,并且我实际上不需要在线处理它们的内容,因此我正在寻找一种方法,将
对象[]
转换为
字节[]
,然后我可以将其写入磁盘

我如何才能做到这一点?

来自:

您可以对类型使用二进制

编辑:如果数组的所有这些元素都是简单类型,则使用位转换器

object[] arr = { 10.20, 1, 1.2f, 1.4, 10L, 12 };
using (MemoryStream ms = new MemoryStream())
{
    foreach (dynamic t in arr)
    {
        byte[] bytes = BitConverter.GetBytes(t);
        ms.Write(bytes, 0, bytes.Length);
    }
}

你可以用老式的方法

static void Main()
{
  object [] arrayToConvert = new object[] {1.0,10.0,3.0,4.0, 1.0, 12313.2342};

  if (arrayToConvert.Length > 0) {
     byte [] dataAsBytes;
     unsafe {
        if (arrayToConvert[0] is int) {
           dataAsBytes = new byte[sizeof(int) * arrayToConvert.Length];
           fixed (byte * dataP = &dataAsBytes[0]) 
              // CLR Arrays are always aligned
              for(int i = 0; i < arrayToConvert.Length; ++i) 
                 *((int*)dataP + i) = (int)arrayToConvert[i];
        } else if (arrayToConvert[0] is double) {
           dataAsBytes = new byte[sizeof(double) * arrayToConvert.Length];
           fixed (byte * dataP = &dataAsBytes[0]) {
              // CLR Arrays are always aligned
              for(int i = 0; i < arrayToConvert.Length; ++i) {
                 double current = (double)arrayToConvert[i];
                 *((long*)dataP + i) = *(long*)&current;        
              }
           }
        } else {
           throw new ArgumentException("Wrong array type.");
        }
     }

     Console.WriteLine(dataAsBytes);
  }
}
static void Main()
{
object[]arrayToConvert=新对象[]{1.0,10.0,3.0,4.0,1.0,12313.2342};
如果(arrayToConvert.Length>0){
字节[]数据字节;
不安全{
如果(arrayToConvert[0]为int){
dataAsBytes=新字节[sizeof(int)*arrayToConvert.Length];
已修复(字节*dataP=&dataAsBytes[0])
//CLR阵列总是对齐的
对于(int i=0;i

但是,我建议您重新审视您的设计。您可能应该使用泛型,而不是对象数组。

不存在接受参数的
ToArray
重载。从doc链接看,类型
似乎会过滤,并且不会转换。实际上,运行代码段会生成一个空的
obj
。在写入数据之前,我的实现被迫转换为字节数组,因为实际的写入是由另一个类完成的。请使用
MemoryStream
而不是
FileStream
。你可以在你的帖子中添加示例数据。我很确定这将不仅仅是序列化值。我已经试过了,对于包含两个整数的对象数组,我得到了一个39字节的流!您可以使用
BitConverter.GetBytes(对于所有简单类型)
方法。我喜欢这个方法,但我会创建MemoryStream,然后使用BinaryWriter对其进行写入。。。漂亮、干净、包装严密。
using System.Runtime.Serialization.Formatters.Binary;

BinaryFormatter binary = BinaryFormatter();
using (FileStream fs = File.Create(file))
{
    bs.Serialize(fs, objectArray);
}
object[] arr = { 10.20, 1, 1.2f, 1.4, 10L, 12 };
using (MemoryStream ms = new MemoryStream())
{
    foreach (dynamic t in arr)
    {
        byte[] bytes = BitConverter.GetBytes(t);
        ms.Write(bytes, 0, bytes.Length);
    }
}
static void Main()
{
  object [] arrayToConvert = new object[] {1.0,10.0,3.0,4.0, 1.0, 12313.2342};

  if (arrayToConvert.Length > 0) {
     byte [] dataAsBytes;
     unsafe {
        if (arrayToConvert[0] is int) {
           dataAsBytes = new byte[sizeof(int) * arrayToConvert.Length];
           fixed (byte * dataP = &dataAsBytes[0]) 
              // CLR Arrays are always aligned
              for(int i = 0; i < arrayToConvert.Length; ++i) 
                 *((int*)dataP + i) = (int)arrayToConvert[i];
        } else if (arrayToConvert[0] is double) {
           dataAsBytes = new byte[sizeof(double) * arrayToConvert.Length];
           fixed (byte * dataP = &dataAsBytes[0]) {
              // CLR Arrays are always aligned
              for(int i = 0; i < arrayToConvert.Length; ++i) {
                 double current = (double)arrayToConvert[i];
                 *((long*)dataP + i) = *(long*)&current;        
              }
           }
        } else {
           throw new ArgumentException("Wrong array type.");
        }
     }

     Console.WriteLine(dataAsBytes);
  }
}