2010-04-29 3 views
0

나는 긍정적이지 않다. 나는 올바른 방향으로 가고있다. 다양한 유형의 출력 (사용자 정의 유형)이있는 응용 프로그램 모음이 있습니다. 예를 들어유형 정의를 직렬화 하시겠습니까?

, 나는 종류의 위젯 불렀다 수 있습니다

사용자가 특정 조건을 경험 작업의 과정, 전반에 걸쳐
Class Widget 
     Public name as String 
End Class 

, 응용 프로그램이 사용자가받은 위젯의 출력 인스턴스를 취할 것입니다, 직렬화 그것을 유형의 이름을 나타내는 데이터베이스에 기록하십시오.

이제는 비슷한 것을하는 다른 응용 프로그램이 있지만 위젯을 다루는 대신 다른 속성을 가진 완전히 다른 임의의 다른 유형이 될 수 있지만 다시 인스턴스를 직렬화하여 db에 기록하고 유형의 이름. 나는 아마도 6 가지 유형이있을 것이고 앞으로 너무 많은 유형을 추가로 예상하지는 않을 것입니다.

이 모든 것이 끝나고 나면이 로그를 살펴보고 기록 된이 데이터의 내용을 사용자가 볼 수있는 관리자 인터페이스가 있습니다. Admin 앱은 관련된 모든 유형에 대한 참조를 가지며, 유형의 이름에 힌트를 둔 몇 가지 기본 스위치 케이스 논리를 사용하여이를 원래 유형으로 캐스팅하고 기본 표시 로직을 가진 핸들러로 전달하여 데이터는 다시 밖으로 읽을 수있는 형식 (종류마다 1 개의 디스플레이 핸들러) NOW

에서 ...이 모든

어느 날까지, 나의 모델이 변경 ... 잘 좋다. 이제 Widget 클래스는 name 속성을 더 이상 사용하지 않으며 많은 다른 속성에 추가되었습니다. 이 데이터를 다시 만들려고 할 때 관리자 측에서 유형 불일치가 발생합니다.

런타임에 어떤 방법이 있는지 궁금 해서요. 아마도 내 코드를 통해 반영 할 수 있었고 정확한 순간에 유형 정의의 스냅 샷을 얻고, 직렬화하고, 데이터와 함께 저장할 수있었습니다. 어떻게 든 미래에 그것을 재구성하는 데 이것을 사용합니까?

답변

1

MFC에서 MFC 일 때 꽤 수동 처리 였으므로 이렇게 할 필요가 없었으므로 .Net에서 다르게 작동하지만 어쨌든 유용 할 수 있습니다. 우리가 그걸 해결 한 방법은 우리가 어떤 것을 직렬화 할 때도 버전 번호를 썼고 새로운 데이터 비트를 추가하기 만하면 아무것도 삭제하거나 수정하지 않았다는 것입니다 (빈 데이터를 출력 할지라도 예를 들어 이름 제거 되었으면 빈 문자열로 씁니다).

그런 다음 디시리얼라이저는 버전 X 이상인 경우 데이터의 특정 부분 만 읽을 수있는 if 문을 많이 사용하며 디시리얼라이저에서 언급 한 모든 내용을 읽은 후에는 아무 것도 무시합니다.

이렇게하면 큰 이점은 이전 버전과 새로운 버전의 앱 모두에서 데이터를 읽을 수 있다는 것입니다. 단, 앱이 누락 된 데이터에 대해 적절한 기본값을 사용할 수있는 경우에만 작동하지만, 관리자 도구의 데이터를 살펴보고 모델을 변경할 때마다 관리 도구를 업데이트하는 것이 시급한 일이 아니라는 장점이 있습니다.

관련 문제