2013-02-19 4 views
1

byte[]에있는 객체를 객체로 변환하려고합니다. 나는 온라인으로 볼이 코드를 사용하여 시도했다 :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[] 각 바이트가 null 아니라, 단지 8 바이트 길이입니다.

제안 사항?

[편집]

바이트는 [] 값이 다른 유형의 숫자가 될 수 있습니다

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

의 라인을 따라 뭔가를 사용하여 C++ 프로그램에서 이진 파일로 작성되었습니다. BitConverter를 사용하여 파일에서 괜찮은 객체로 캐스트 할 수 있지만 BitConverter에서 수행 할 수없는 모든 작업은 수행 할 수 없습니다.

+2

:

귀하의 방법은 다음과 같이 될 것인가? 어떤 형식입니까? – cdhowie

+0

'(객체) 바이트 '처럼 왜 그냥 캐스팅 할 수 없습니까? 다른 것을 이루려고하십니까? –

+4

데이터가 올바르게 처음부터 올바르게 serialize 되었습니까? – MadSkunk

답변

0

cdhowie에서 설명한대로 수동으로 인코딩 된 데이터를 deserialize해야합니다. 사용 가능한 제한된 정보를 기반으로 개체 배열이나 배열이 포함 된 개체를 원할 수 있습니다. 하나의 긴 코드가 있지만 코드에서 알 수있는 방법이없는 것처럼 보입니다. 실제 형식으로 개체를 다시 만들어야하므로 하나의 긴 배열에 대한 간단한 예제로 아래 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

어쩌면 나는 분명히 미안하지 않을지도 모른다.나는 C++ 프로그램에서 바이너리 파일에 쓰여진 T 타입의 객체를 가지고 있습니다.이 객체는 위에서 쓴 것처럼 객체에 대해 reinterpret_cast 을 작성했습니다. 파일에서이 개체를 가져와야합니다. 나는 당신이 여기에서했던 것처럼 위에서 말했듯이 BitConverter를 사용하여 찾고자하는 타입을 알고 있습니다. 하지만이 메서드로 DateTime과 같은 다른 것들을 할 수는 없으므로 객체로 변환하는 방법이 있기를 바란다. 그리고 나서 거기에서 아무 것도 얻을 수 없다. – James

+1

나는이 동일한 문제를 VB6에서 C#으로 옮겼습니다. VB6에서는 사용자 정의 유형의 배열을 이진 파일로 슬래 밍 한 다음 다시 읽으며 언어에서 바이트를 유형으로 변환합니다. C# AFAIK에서는 그렇지 않습니다. DateTime.Ticks는 Long이며 BitConverter.ToInt64로 변환 할 수 있습니다. –