.NET

2010-03-26 3 views
1

에 복잡한 개체의 상태를 해싱 어떤 배경 정보 : 나는 기본적으로 생성, 편집, 저장 및 일부 데이터 모델의 로딩하는 C의 #/WPF 응용 프로그램 작업입니다.NET

.

데이터 모델에는 다양한 개체의 계층 구조가 포함됩니다. 클래스 A의 "루트"오브젝트가 있는데, 클래스 B의 오브젝트 목록이 있으며, 클래스 C의 오브젝트 목록이 있습니다. 전체적으로 약 30 개의 클래스가 있습니다.

이제 내 문제는 사용자에게 "저장하지 않은 변경 사항을 저장하고 저장 하시겠습니까?"라고 묻는 것입니다. 그가 프로그램을 종료하려고하면 대화 상자가 나타납니다. 그러나 현재로드 된 모델의 데이터가 실제로 변경되었는지 어떻게 알 수 있습니까?

물론이를 해결할 방법이 있습니다. 파일에서 모델을 다시로드하고 값으로 메모리 값과 비교하거나 모든 UI 컨트롤에서 모델이 변경되었음을 나타내는 플래그를 설정합니다. 대신로드시 모델 상태를 기반으로 해시 값을 만들고 사용자가 종료하려고 할 때 새 값을 생성하고이 두 값을 비교하려고합니다.

는 이제 질문 : 어떤 임의의 복잡한 객체의 (값) 상태에서의 해시 값을 생성 할 수있는 방법이 존재하는 경우

그래서 그 영감이 궁금 해서요? 바람직하게는 일반적인 방법으로, 예를 들면. 각 관련 클래스/필드에 속성을 적용 할 필요가 없습니다.

한 가지 아이디어는 .NET의 직렬화 기능을 사용하는 것일 수 있습니다 (이 경우 out-of-the-the-box를 사용한다고 가정). 결과 파일의 내용에 해시 함수를 적용합니다. 그러나, 나는 더 적절한 접근법이 존재한다고 생각한다.

미리 감사드립니다.

편집 : 해싱 가능한 충돌에 대해 촬영

포인트. 대신 나는 값으로 가치를 깊이 비교할 것입니다. 난 이미 XML serializer를 사용하여 영속성을 유지하고 있으므로 문자를 직렬화하고 비교할 것입니다. 예쁜 것은 아니지만이 경우 트릭을 수행합니다.

답변

0

나는 이것에 대해 조언 할 것이다. 다른 객체는 동일한 해시를 가질 수 있습니다. 변경 사항을 저장해야하는지 여부를 확인하기 위해이 방법을 사용하는 것은 안전하지 않습니다.

+0

찍은 포인트. 나는 두 객체의 값 기반 비교와 관련된 문제를 수정하겠다고 생각한다. – Jan

1

좋아, 물론 반사와 일종의 재귀 함수를 사용할 수 있습니다. 그러나 모든 개체는 특정 개체의 모델이라는 것을 명심하십시오. 아마도 "중요하지 않은"필드와 속성이 많이있을 수 있습니다.

그리고 @compie 덕분에! 도메인에 대해서만 해시 함수를 만들 수 있습니다. 그러나 이것은 강력한 수학 기술을 필요로합니다.

그리고 SHA와 같은 고전적인 해시 함수를 사용할 수 있습니다. 그냥 개체가 문자열 또는 바이트 배열이라고 가정합니다.

+0

반사를 사용하여 객체의 값을 배열로 가져오고 싶습니다. 30 가지 클래스의 IComparers를 구현하는 것보다 유혹을 느낍니다. – Jan

0

WPF 앱이므로 변경 사항이 발생할 때 변경 사실을 알리는 것보다 쉽습니다. WPF의 이벤트 아키텍처를 사용하면 이벤트가 실제로 시작된 위의 수준에서 이벤트 처리기를 만들 수 있습니다. 따라서 인터페이스의 루트 창에서 UI 요소의 다양한 "change"이벤트에 대한 이벤트 처리기를 만들고 해당 범위에서 "changed"플래그를 설정할 수 있습니다.

WPF Routed Events Overview

+0

답장을 보내 주셔서 감사합니다. 나는 Routed Events에 대해 알고 있지만 제 경우에는 모델의 다른 부분에 대한 여러 창이 있고 WinForms의 Property Grid를 사용하기 때문에 구현하기가 그리 어렵지 않습니다. 그러나 여전히 실행 가능한 솔루션입니다. – Jan