2008-09-25 3 views
2

관리자가 XML 파일로 직렬화 된 설정 클래스로 사용하는 클래스가있어서 관리자가 편집하여 응용 프로그램의 설정을 변경할 수 있습니다. (설정은 App.config에서 허용하는 것보다 조금 더 복잡합니다.)XML 파일을 읽기 전용 속성이있는 클래스로 deserialize하는 방법은 무엇입니까?

XmlSerializer 클래스를 사용하여 XML 파일을 deserialize하고 속성 클래스를 설정할 수 있기를 원하지만, 클래스/어셈블리를 사용하는 다른 개발자가 코드를 통해 속성을 설정/변경할 수 있기를 바랍니다. XmlSerializer 클래스를 사용하여이 작업을 수행 할 수 있습니까?

몇 가지 세부 정보 추가 :이 특정 클래스는 Collection이며 FxCop에 따르면 XmlSerializer 클래스는 읽기 전용 컬렉션을 deserialize하는 데 대한 특별한 지원을하고 있지만 더 이상 정보를 찾을 수 없었습니다. 이 규칙 위반에 대한 자세한 내용은 다음과 같습니다.

컬렉션을 반환하는 속성은 읽기 전용이므로 사용자가 원래 저장소를 완전히 대체 할 수 없습니다. 사용자는 컬렉션의 관련 메서드를 호출하여 컬렉션의 내용을 수정할 수 있습니다. XmlSerializer 클래스는 읽기 전용 컬렉션을 deserialize하는 데 특별한 지원을합니다. 자세한 내용은 XmlSerializer 개요를 참조하십시오.

이것은 내가 원했던 것이지만 어떻게 그럴 수 있습니까?

편집 : 좋아, 여기 조금 미쳤다고 생각해. 필자의 경우, 생성자에서 Collection 객체를 초기화 한 다음 속성 setter를 제거해야했습니다. 그런 다음 XmlSerializable 개체는 실제로 Collection 개체의 Add/AddRange 및 인덱서 속성을 사용하는 것을 알고 있습니다. 다음은 실제로 작동합니다!

public class MySettings 
{ 
    private Collection<MySubSettings> _subSettings; 
    public MySettings() 
    { 
     _subSettings = new Collection<MySubSettings>(); 
    } 

    public Collection<MySubSettings> SubSettings 
    { 
     get { return _subSettings; } 
    } 
} 
+0

SubSettings 속성에서 실제로 읽기 전용 컬렉션을 반환하지 않고 수정할 수있는 컬렉션을 반환하고 있습니다. –

+0

나는 그것을 얻지 못한다. 당신은 전에 무엇을 했습니까? 내 말은, 사람들이 막지 못하게하는 것입니다. SubSettings = Blah; 컬렉션 자체는 실제로 읽기 전용이 아닙니까? –

+0

@Rob Cooper : 그의 코드에서 볼 수 있듯이 컬렉션은 읽기 전용이 아닙니다. 그는 여전히 변경 가능한 컬렉션을 반환하지만 클래스에서 사용하는 참조는 변경할 수 없습니다. 이것이 그가 의도 한 바라면 괜찮습니다. – user7116

답변

4

ArrayList (또는 IList IIRC)와 같이 변경 가능한 목록 유형을 사용해야합니다.

+0

그래, 고마워, 그것도 acnumerable 또는 ICollection,하지만 네가 대답은 내가 발견 한 것과 아주 가깝다. –

1

속성은 읽기 전용이므로 자동 직렬화를 사용할 수 없다고 생각합니다.

실천의 길은 ISerializable 인터페이스를 구현하고 수동으로 수행하는 것입니다. 여기에서 내부 값을 설정할 수 있습니다. (읽기 전용으로 노출) 귀하의 하위 개체가 자신을 직렬화 돌볼 수있는 경우

그러나, 모든 단지 작동합니다 ..

를 내가의 FxCop에 대해 신음하는 규칙은 당신이 뭔가를 가지고 있다고 생각합니다 like :

public List<MyObject> Collection 
{ 
    get { return _collection; } 
    set { _collection = value; } 
} 

그렇지 않습니까? 그렇지 않다면 몇 가지 코드를 붙여 넣어 정확히 무엇을하고 있는지 확인할 수 있습니까? 위의 모든 작업을 수행하는 방법에는 여러 가지가 있습니다.

+0

그래, 대답 주셔서 감사합니다 ... 나는 수동으로 할 필요가 없었 으면 좋겠다. 실제로이 경우에는하지 않았 음을 알 수 있습니다 (질문 편집 참조). 더 복잡한 경우 아마 그 길을 가야했을 것입니다. –

+0

편집 지연으로 불편을 끼쳐 드려 죄송합니다. 제출하기 전에 사이트가 다운되었습니다! : D –

1

@Rob Cooper가 올바르게 입력 했으므로 ISerializable 인터페이스 만 구현하면 클래스의 직렬화 및 비 직렬화 및 수동으로 필드를 설정하는 방법을 사용자 정의 제어 할 수 있습니다. 그것은 좀 더 다리 작업이지만 원하는 목표를 달성 할 것입니다. 행운을 빕니다.

0

@ leppie의 응답이 실제로 가장 가까웠습니다.XmlSerializer 설명서의 실제 관련 텍스트입니다. 위의 질문에 대한 자세한 내용은 위의 내용을 참조하십시오.

XmlSerializer는 IEnumerable 또는 ICollection을 구현하는 클래스에 특별한 처리 방법을 제공합니다. IEnumerable을 구현하는 클래스는 단일 매개 변수를 사용하는 공용 Add 메서드를 구현해야합니다. Add 메서드의 매개 변수는 GetEnumerator에서 반환 된 값의 Current 속성에서 반환되는 것과 같은 형식이거나 해당 형식의 기본 형식 중 하나 여야합니다. IEnumerable 외에 ICollection (CollectionBase 등)을 구현하는 클래스에는 정수를 사용하는 공용 Item 인덱스 속성 (C#의 인덱서)이 있어야하며 정수 유형의 공용 Count 속성이 있어야합니다. Add 메서드의 매개 변수는 Item 속성에서 반환되는 것과 동일한 형식이거나 해당 형식의 기본 형식 중 하나 여야합니다. ICollection을 구현하는 클래스의 경우 직렬화 할 값은 GetEnumerator를 호출하지 않고 인덱싱 된 Item 속성에서 검색합니다.

관련 문제