2013-02-19 93 views
1

我试图将我在byte[]中的对象转换为对象。 我已经使用这个代码,我在网上找到了尝试:将字节[]转换为对象

object byteArrayToObject(byte[] bytes) 
    { 
     try 
     { 
      MemoryStream ms = new MemoryStream(bytes); 
      BinaryFormatter bf = new BinaryFormatter(); 
      //ms.Position = 0; 
      return bf.Deserialize(ms,null); 
     } 
     catch 
     { 
      return null; 
     } 
    } 

SerializationException:“流的末尾遇到了 完成解析之前。”

我与ms.Position = 0行注释掉当然太试过...... bytes[]只有8个字节长,每个字节是不是null

对此提出建议?

[编辑]

字节[]使用沿

void WriteToFile (std::ostream& file,T* value) 
{ 
    file.write(reinterpret_cast<char*>(value), sizeof(*T)) 
} 

线凡值可以是许多不同类型的东西写入到从C++程序二进制文件。 我可以使用BitConverter从文件转换为某些对象,但任何BitConverter不会覆盖我不能做的。

+2

哪些数据包含此数组中(写在编辑器)?它的格式是什么? – cdhowie 2013-02-19 16:41:50

+0

为什么你不能像'(object)bytes'一样投射它?你想完成别的事吗? – 2013-02-19 16:42:14

+4

您确定数据序列化是否正确? – MadSkunk 2013-02-19 16:42:51

回答

0

正如cdhowie所述,您需要手动反序列化编码数据。基于可用的有限信息,您可能需要一个对象数组或一个包含数组的对象。它看起来像你有一个单一的长,但没有办法知道你的代码。您将需要以其真实形式重新创建对象,因此请将myLong作为单个长阵列的简单示例。由于这是不确定我会假设你想包含数组就像一个结构:

public struct myLong { 
    public long[] value; 
} 

你可以做同样的事情与结构,或类的数组有小的改动贴在下面的代码。

你的方法是这样的:

private myLong byteArrayToObject(byte[] bytes) { 
    try 
    { 
     int len = sizeof(long); 
     myLong data = new myLong(); 
     data.value = new long[bytes.Length/len]; 
     int byteindex = 0; 
     for (int i = 0; i < data.value.Length; i++) { 
      data.value[i] = BitConverter.ToInt64(bytes,byteindex); 
      byteindex += len; 
     }    
     return data; 
    } 
    catch 
    { 
     return null; 
    } 
} 
+0

也许我不是很抱歉。我有一个任何类型T的对象,它是从C++程序写入二进制文件的,如上所示,它在对象写入时对它执行reinterpret_cast 。我需要从文件中检索这个对象。我知道要查找哪种类型,以及我使用BitConverter获得的一些类型,正如我上面所述以及您在此处所做的那样。但我不能做一些其他的,如DateTime与这种方法,所以我希望有一种方法来将其转换为一个对象,然后我可以从那里得到任何东西...... – James 2013-02-20 00:31:10

+1

我有同样的问题,当我从VB6移到C#。在VB6中,您可以将用户定义类型的数组强制转换为二进制文件,然后再读取它们,然后语言将字节转换为该类型。与C#AFAIK不一样。 DateTime.Ticks很长,可以使用BitConverter.ToInt64进行转换。 – 2013-02-20 02:22:00