2010-04-03 8 views
3

두 개의 콜렉션이있는 애플 리케이션의 설정 객체가 있습니다. 컬렉션은 속성 가방 모음을 포함하는 간단한 List 제네릭입니다. 내가 역 직렬화 할 때일반 콜렉션 비 직렬화

XmlSerializer x = new XmlSerializer(settings.GetType()); 
TextWriter tw = new StreamWriter(@"c:\temp\settings.cpt"); 
x.Serialize(tw, settings); 

그러나, 모든 것이 두 컬렉션을 제외하고 복원 (세터에 중단 점 설정에 의해 확인 :

XmlSerializer x = new XmlSerializer(typeof(CourseSettings)); 
XmlReader tr = XmlReader.Create(@"c:\temp\settings.cpt"); 
this.DataContext = (CourseSettings)x.Deserialize(tr); 

을 내가 직렬화 할 때, 모든 것이 문제없이 저장됩니다 무엇이 이것의 원인일까요? 모든 것이 바닐라입니다 ... 설정 개체의 일부분 ... 대부분을 생략 한 PresentationSourceDirectory는 정상적으로 작동하지만 PresentationModules의 설정자는 충돌하지 않습니다.

private string _presentationSourceDirectory = string.Empty; 
public string PresentationSourceDirectory { 
    get { return _presentationSourceDirectory; } 
    set { 
    if (_presentationSourceDirectory != value) { 
     OnPropertyChanged("PresentationSourceDirectory"); 
     _presentationSourceDirectory = value; 
    } 
    } 
} 

private List<Module> _presentationModules = new List<Module>(); 
public List<Module> PresentationModules { 
    get { 
    var sortedModules = from m in _presentationModules 
         orderby m.ModuleOrder 
         select m; 
    return sortedModules.ToList<Module>(); 
    } 
    set { 
    if (_presentationModules != value) { 
     _presentationModules = value; 
     OnPropertyChanged("PresentationModules"); 
    } 
    } 
} 

답변

1

목록이 deserialize되면 setter가 호출되지 않습니다. 그냥 getter. Deserializer는 #Add() 메서드를 호출하고 직렬화 된 요소를 Exiting List에 추가합니다. 이는 디자인 별 동작입니다. MSDN을 참조하십시오.
linq 문없이 목록을 가져 오는 새 속성을 추가 할 수 있습니다. [XmlIgnore]를 기존 속성에 추가하면 XmlSerializer가이 속성을 이제 건너 뜁니다.

[XmlIgnore] 
public List<Module> PresentationModules { 

목록을 노출하는 새 속성 만들기 :이 속성에 새 목록을 할당하면 PresentationModules의 세터에 대한 여러분의 이벤트에만 호출됩니다

private List<Module> _presentationModules = new List<Module>(); 
public List<Module> PresentationModulesList { 
    get { return _presentationModules; } 
} 

. 어쩌면 당신은 세터를 비공개로 만들어야 할 것입니다.

+0

좋아,이 의미가 있지만,이 옵션을 해결할 수있는 방법이 무엇인지 명확하지 않습니다. 그것은 내가 돌아 가야하고 사용자 정의 serializer를 구현해야/드 내 개체를 수정 한 후 do not't 수집 setter 수용 ... 그 유일한 옵션은 무엇입니까? –

+0

답변을 업데이트했습니다. 어쩌면 이것이 당신이 원하는 것일 수 있습니다. 세터에서 호출하는 이벤트가 요구 사항입니까? – chriszero

+0

감사합니다 chriszero ... 이제 할 일이 있습니다 ... 많은 감사합니다! –

0

사용자 정의 정보를 추가하기 위해 직렬화 및 역 직렬화 메소드를 대체 할 수 있습니다. 이런 식으로 구현 한 지 오래되었지만 직렬화 데이터를 받으면 개체에서 일부 개인 멤버를 재구성하기 위해 재정의해야한다는 것을 상기합니다.