2010-04-02 5 views
4

classBattleGame으로 변경했으며 "탈 직렬화에 필요한 battle.classBattle + udtCartesian 유형을로드 할 수 없습니다."라는 메시지가 표시되지 않습니다.클래스의 이름을 바꾸면 직렬화 오류가 발생합니다. 그것을 고치는 방법?

MapSize = (Game.udtCartesian)formatter.Deserialize(fs);

가 어떻게이 문제를 해결 할 코드의 라인? 이것은 내가 수업을 개명 할 수 없다는 것을 의미합니까?

+0

완벽을 기하기 위해이 문제를 "직렬화 대리"로 해결할 수도 있지만 그 일은 지저분하고 어렵습니다. 처음에는 계약 기반 시리얼 라이저로 시작하는 것이 더 좋습니다. 또한, [TypeForwardedTo]를 사용하는 한 * 유형을 (어셈블리 사이에서) 이동할 수 있지만 이름을 바꾸기는 쉽지 않습니다. –

+0

먼저 XmlSerialize를 사용하여 직렬화하는 방법을 알아야합니다. 전략 게임 프로그래밍을 배우기 위해 http://www.codeproject.com/KB/game/BattleField.aspx를 수정하려고합니다. 지도 편집기는 BinaryFormatter를 사용합니다. –

답변

4

BinaryFormatter은 부서지기 쉽지 않으므로 친화적 인 설계가되어 있지 않습니다. if you have changes to the types involved. 이러한 유형의 동작을 원하면 XmlSerializer, DataContractSerializer 또는 protobuf-net과 같은 계약 기반 직렬 변환기가 필요합니다. BinaryFormatter을 제외한 모든 항목

+0

http://code.google.com/p/protobuf-net 추천 답변을 게시하려고했으나 Marc (누가 작성 했습니까?)에게 연기합니다. –

1

계약을 사용하지 않는 경우 직렬화 할 때 클래스 이름이 일부이기 때문에 클래스 이름을 비 직렬화해야한다는 이유가 동일해야합니다.

클래스 이름을 변경하고, 다시 serialize하고, 문제없이 deserialize 할 수 있습니다.

작동하지 않는 것은 한 이름으로 직렬화하고 다른 이름으로 다시 역 직렬화하는 것입니다.

그런 다음 계약서와이를 사용하는 포맷터를 사용하십시오.

4

또한 다른 유형의 직렬화 복원되는 경우에로드됩니다 유형을 정의 할 SerializationBinder을 사용할 수

public sealed class Version1ToVersion2DeserializationBinder : SerializationBinder 
{ 
    public override Type BindToType(string assemblyName, string typeName) 
    { 
     Type typeToDeserialize = null; 

     if (typeName == "OldClassName") 
      typeName = "NewClassName"; 

     typeToDeserialize = Type.GetType(String.Format("{0}, {1}", 
              typeName, assemblyName)); 

     return typeToDeserialize; 
    } 
} 

이 역 직렬화하려면, 당신은 단지 BinaryFormatterBinder 속성을 설정해야합니다 :

formatter.Binder = new Version1ToVersion2DeserializationBinder(); 
NewClassName obj = (NewClassName)formatter.Deserialize(fs); 
0

저장된 데이터가 염려되지 않으면 파일을 삭제하면 새 파일이 새 이름으로 저장됩니다.

관련 문제