2011-02-24 2 views
1

가 :간단한 유형의 직렬화가 왜 그렇게 복잡한가요? 다음 코드를 실행할 때

int myInt = 13; 
object myObj = myInt; 
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new  System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
     System.IO.MemoryStream ms = new System.IO.MemoryStream(); 
     bf.Serialize(ms, myObj); 
     byte[] myByteArray = ms.ToArray(); 

당신이 길이가 54 바이트 배열을 얻을 - 당신이 4 바이트 길이의 배열을하지 않는 이유를 이해하지 않습니다.

int 변수 (객체 변수 대신)를 다음과 같이 직렬화하려고해도 : bf.Serialize (ms, myInt);

같은 결과가 나타납니다. 내 목표는 바이트 배열에 다른 유형 (INT32, INT16, 등 ...) 변환하는 것입니다 그것은 컴파일하지 않기 때문에, 따라서 나는

BitConverter.GetBytes(myObj); 

을 사용할 수 없습니다

Error 1 The best overloaded method match for 'System.BitConverter.GetBytes(bool)' has some invalid arguments... 

분명하다 왜냐하면 컴파일러는 명시 적으로 명시하지 않고 객체를 다른 것으로 변환 할 수 없으므로 ...

내가 뭘 잘못하고 있니?

답변

4

형식에 대한 모든 정보를 직렬화해야하기 때문에 4 바이트 배열을 얻지 못합니다. 버전 관리 등 여러 가지 형식을 serialize하려는 경우 - int과 두 short 값을 입력하십시오. 데이터 형식을 지정하지 않고 serialize/deserialize 할 수있게하려면 의 모든 데이터 유형을 포함하지 않으시겠습니까?

프리미티브를 직접 작성하려는 경우 BinaryWriterBinaryReader을 사용하십시오.

좀 더 컴팩트하고 이식 가능한 이진 직렬화 프로토콜을 원하면 프로토콜 버퍼 (또는 여러 가지 다른 직렬화 옵션)를 사용하는 것이 좋습니다.

1

LosFormatter 또는 ObjectStateFormatter을 사용하는 것은 프리미티브 유형에 특화된 것입니다. 예제를 사용하면 크기가 8 및 4 인 배열이됩니다.

관련 문제