2013-04-02 4 views
1

바이트 배열을 개체로 변환하려고합니다. 모든 가능한 문제를 제거하기 위해 간단하게 원래 코드에서 깨는 함수를 호출하고 동일한 오류가 발생하는 간단한 Windows 양식을 만들었습니다. 무슨 일이 벌어지고있는가에 대한 생각?직렬화 예외 : 구문 분석을 완료하기 전에 발생한 스트림의 끝 - C#

private void button1_Click(object sender, EventArgs e) 
    { 
     byte[] myArray = new byte[] {1, 2, 3, 4, 5, 6, 7}; 
     object myObject = ByteArrayToObject(myArray); 

     if(myObject != null) 
     { 
      button1.Text = "good"; 
     } 
    } 

    private object ByteArrayToObject(byte[] arrBytes) 
    { 
     System.Runtime.Serialization.Formatters.Binary.BinaryFormatter binForm = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
     MemoryStream memStream = new MemoryStream(arrBytes); 
     memStream.Position = 0; 
     return binForm.Deserialize(memStream); 
    } 
+3

그리고 그 특정 바이트 배열이 유효한 객체를 만드는 이유는 무엇입니까? –

+0

바이트 배열이 유효한 객체를 만들 수있는 자격을 얻거나 실격 처리하는 것은 무엇입니까? –

+1

이진 직렬화는 단순히 바이트를 직렬화하는 것 이상을 수행합니다. * type safe *이며 객체를 설명하는 스트림에 메타 데이터를 추가합니다. –

답변

1

결과 개체로 무엇을하고 있는지 실제로 말하지 않으므로보다 구체적인 답변을 드릴 수 없습니다.

private void button1_Click(object sender, EventArgs e) 
{ 
    byte[] myArray = new byte[] { 1, 2, 3, 4, 5, 6, 7 }; 
    object myObject = myArray as object; 

    if (myObject != null) 
    { 
     button1.Text = "good"; 
    } 
} 
+0

방금 ​​개체 중 하나 인 인수가 필요한 라이브러리 함수가있어서 데이터 묶음을 전달해야했습니다. 나는 Byte Array를 웹상의 객체로 변환하는 코드를 찾았고 한 무리의 장소에서 사용 되었기 때문에 그것이 완료되었다고 가정했다. –

+0

@KhaledBoulos 개체 매개 변수가 있으면 아무 것도 변환 할 필요가 없습니다 ... 모든 것이 개체입니다. 확실히 그것을 직렬화하지 않는다 ... 그냥 method (myArray)를 호출한다. –

+0

@caerolus - true. 컴파일 할 수 있고 런타임에 실패 할 수 있음을 보여주기 위해'as '를 사용했습니다. 실제로 원래의 줄은'object myObject = myArray;' –

1

BinaryFormatter은 단순히/쓰기 바이트를 읽어보다 더 많은 작업을 수행합니다 그러나 바이트 배열 이미 개체입니다.

당신이 볼
0, 1, 0, 0, 0, 255, 255, 255, 255, 1, 0, 0, 0, 0, 0, 0, 0, 15, 1, 0, 0, 0, 7, 0, 0, 0, 2, 1, 2, 3, 4, 5, 6, 7, 11 

이있다 :

byte[] myArray = new byte[] { 1, 2, 3, 4, 5, 6, 7 }; 

System.Runtime.Serialization.Formatters.Binary.BinaryFormatter binForm = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
MemoryStream memStream = new MemoryStream(); 
// Serialize the array 
binForm.Serialize(memStream, myArray); 
// Read serialized object 
memStream.Position = 0; 
byte[] myArrayAgain = new byte[memStream.Length]; 
memStream.Read(myArrayAgain, 0, myArrayAgain.Length); 

가 직렬화 된 내용이 있음을 밝혀 :

하면 먼저 직렬화 된 객체의 내용을 읽고 다음 직렬화 및 예제를보십시오 머리말과 꼬리말. 실제 목표는 거의 끝입니다.