2012-07-26 96 views
2

我有一個包含未在編譯時已知不同類型的數組的對象陣列,但證明是int[]double[]角色對象數組字節數組

我要保存這些陣列到磁盤而且我並不需要在線處理它們的內容,所以我正在尋找一種方法將object[]轉換爲byte[],然後我就可以寫入磁盤。

我該如何做到這一點?

回答

2

您可以使用二進制serialization and deserializationSerializable類型。

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

在寫入數據之前,我的實現被迫轉換爲一個字節數組,因爲實際的寫入是由不同的類完成的。 – kasperhj 2012-07-26 10:25:04

+0

使用'MemoryStream'而不是'FileStream'。您可以在帖子中添加示例數據。 – adatapost 2012-07-26 10:32:04

+0

我很確定這會做別的事情,而不僅僅是序列化值。我已經試過了,對於包含兩個整數的對象數組,我得到一個39字節的數據流! – kasperhj 2012-07-26 11:59:06

0

here

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

,或者如果你的列表是複雜類型:

list.CopyTo(obj); 
+0

沒有帶有參數的ToArray重載。 – kasperhj 2012-07-26 10:16:07

+0

@lejon:更新的答案 – Ria 2012-07-26 10:20:52

+0

從文檔鏈接看來'OfType'過濾器並不轉換。確實運行你的代碼片段會產生一個空的'obj'。 – kasperhj 2012-07-26 10:27:38

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

但是,我建議您重新訪問您的設計。您應該使用泛型,而不是對象數組。

+0

我喜歡這個,但我會創建MemoryStream,而不是使用BinaryWriter寫入它...好,乾淨,緊湊。 – 2012-07-26 11:17:22