2012-06-27 3 views
1

MySQL 데이터베이스에 BLOB로 저장된 여러 객체를 비 직렬화하는 동안 문제가 발생합니다.캐스팅에도 불구하고 잘못된 클래스 비 직렬화

각 객체 클래스에는 자체 deserialize 기능이 있습니다.

Class2 c2Holder = (Class2)binFormatter.Deserialize(memStream); 

Class1 c1Holder = (Class1)binFormatter.Deserialize(memStream); 

작품 좋은,하지만이 ... ... 클래스 1의 역 직렬화 함수를 호출합니다. VS 2010 디버거를 사용하여 단계별로 실행하면 두 번째 시도에서 올바른 기능을 호출합니다.

Class3 c3Holder = (Class3)binFormatter.Deserialize(memStream); 

또한 은 ... 클래스 1의 직렬화 기능, 다음 Class2의 기능과 마지막으로 올바른 함수를 호출합니다.

아이디어가 있으십니까? 코멘트에서

+0

Class2는 Class1에서 상속 받았으며 Class2는 Class2에서 상속합니까? –

+0

binFormatter는 어디서 제공됩니까? –

+0

그것은'BinaryFormatter'입니까? 'BinaryFormatter'를 사용하면 데이터 자체가 무엇을 구성하는지 정의합니다 (어셈블리 한정 형식 이름이 직렬화 된 데이터에 있음). 그래서 :'memStream'에 무엇이 있습니까? 데이터는 어디에서 왔습니까? 직렬화되었을 때 'Class1'이었습니까? –

답변

1

:

'Assembly.Class4'를 입력 유형 'Assembly.Class1'의 개체를 캐스팅 할 수 없습니다.

'Assembly.Class2'형식의 개체를 'Assembly.Class4'형식으로 캐스팅 할 수 없습니다.

'Assembly.Class3'유형의 개체를 'Assembly.Class4'유형으로 캐스팅 할 수 없습니다.

이는 실제로 데이터가 실제로 다른 유형이 될 것으로 예상한다는 의미입니다. BinaryFormatter의 요점은 Class7을 serialize하면 class7로 deserialize됩니다. 다른 serializer에서는 deserialize 할 대상을 지정해야하며, 서로 다른 형식을 사용하면 서로 비슷하게 교환 할 수 있습니다.

따라서 BinaryFormatter를 사용하는 경우 Class2를 얻으려면 Class2로 직렬화하십시오.

object tmp = binFormatter.Deserialize(memStream); 
Class2 c2Holder = (Class2)tmp; 

즉 "그 무엇으로 직렬화 : - 더 같다

Class2 c2Holder = (Class2)binFormatter.Deserialize(memStream); 

"는 Class2의로 이것을 역 직렬화 "말을하지 않습니다

는 다음, 명확하게하려면 그런 다음 Class2로 캐스팅합니다. " 이 Class2 인 경우이 아니므로 실패합니다. 이것은 변환 등이 아닙니다 - 유형 검사 전용입니다.

비슷하지만 다른 유형으로 작동하는 직렬화에 대한 조언을 원하시면 알려주십시오.

+0

설명해 주셔서 감사합니다. 내가 권고 한대로 코드를 수정했는데 문제가 드러났습니다. 나는 그것을 직렬화 할 때 특별히 객체를 캐스팅하지 않았습니다. 단일 함수에서 모든 개체를 serialize 할 때 serialization 함수는 각 클래스에 대해 GetObjectData()를 호출하지만 serialize 된 첫 번째 개체의 형식을 유지합니다. serializer 코드를 binFormatter.Serialize (memStream, c2Holder); to binFormatter.Serialize (memStream, (Class2) c2Holder); 에서 개체를 완벽하게 deserialize. 귀하의 도움을 주셔서 감사합니다 – user1485779

+0

@ user1485779 어, 그건 아주 이상합니다. 사용자 지정 변환 연산자가 정의되어 있지 않으면 BinaryFormatter ***에 전혀 영향을 미치지 않습니다. 필자는 직렬화 된 코드와 관련된 클래스를 확인하는 데 필요한 완전한 대답을 제공 할 것이라고 생각합니다. 여기에 조금 의심스러운 것이 있습니다 ... –