我有一个包含不同类型数组的对象数组,在编译时无法确定其类型,但实际上是
我想将这些数组保存到磁盘上,并且不需要在线处理它们的内容,因此我正在寻找一种将
如何实现这一点?
int[]
、double[]
等。我想将这些数组保存到磁盘上,并且不需要在线处理它们的内容,因此我正在寻找一种将
object[]
转换为byte[]
的方法,然后可以将其写入磁盘。如何实现这一点?
int[]
、double[]
等。object[]
转换为byte[]
的方法,然后可以将其写入磁盘。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*)¤t;
}
}
} else {
throw new ArgumentException("Wrong array type.");
}
}
Console.WriteLine(dataAsBytes);
}
}
然而,我建议您重新考虑您的设计。您可能应该使用泛型,而不是对象数组。
从这里开始:
List<object> list = ...
byte[] obj = (byte[])list.ToArray(typeof(byte));
或者,如果您的列表是复杂类型:
list.CopyTo(obj);
ToArray
的重载。 - kasperhjOfType
是用于过滤而非转换的。实际上,运行您的代码片段会产生一个空的 obj
。 - kasperhj
MemoryStream
代替FileStream
。您可以在帖子中添加示例数据。 - KV PrajapatiBitConverter.GetBytes
方法(适用于所有简单类型)。 - KV Prajapati