3

コンパイル時には不明な別のタイプの配列を含むオブジェクト配列がありますがint[]double[]などであることが判明しました。

これらの配列をディスクに保存したいのですが、その内容をオンラインで処理する必要はあまりないので、 を にキャストしてディスクに書き込む方法を探していobject[]ますbyte[]

どうすればこれを達成できますか?

4

3 に答える 3

3

シリアル化可能なタイプには、バイナリのシリアル化と逆シリアル化を使用できます。

using System.Runtime.Serialization.Formatters.Binary;

BinaryFormatter binary = BinaryFormatter();
using (FileStream fs = File.Create(file))
{
    bs.Serialize(fs, objectArray);
}

編集:配列のこれらすべての要素が単純型である場合は、BitConverterを使用してください。

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);
    }
}
于 2012-07-26T10:09:41.093 に答える
2

昔ながらの方法でそれを行うことができます。

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);
  }
}

ただし、デザインを再検討することをお勧めします。オブジェクト配列ではなく、おそらくジェネリックを使用する必要があります。

于 2012-07-26T11:03:58.753 に答える
0

ここから:

List<object> list = ...
byte[] obj = (byte[])list.ToArray(typeof(byte));

またはリストが複合型の場合:

list.CopyTo(obj);
于 2012-07-26T10:01:36.717 に答える