2010-04-10 2 views
1

내 개체를 저장하는 데 문제가 있습니다. 이 코드를 살펴 :XmlSerializer.Serialize가 파일을 저장하지 않고 예외를 throw하지 않습니다.

public void SerializeToXML(String FileName) 
{ 
    XmlSerializer fSerializer = new XmlSerializer(typeof(Configuration)); 
    using (Stream fStream = new FileStream(FileName, FileMode.Create, FileAccess.Write, FileShare.None)) 
    { 
     fSerializer.Serialize(fStream, this); 
    } 
} 

문제는 사용자가 하드 디스크의 위치에 권한이없는 경우,이 함수는 나에게 어떤 예외를 throw하지 않습니다 내 파일을 저장하지 않는다는 것입니다. 예를 들어 "C : \ test.xml"에 저장하면 아무 일도 일어나지 않습니다. 그리고 파일이 저장되지 않았는지 알고 싶습니다. 그 이유를 아는 것이 좋습니다.

주어진 위치에있는 파일이 있는지 확인하고 수동 예외를 throw 할 수 있지만 XmlSerializer 또는 FileStream 자체에서 수행하면 안됩니다. 시간에 대한

감사

편집 :

내가 몇 가지 추가 디버깅을했다 의심되면서. using 절을 사용하므로 디버그 섹션의 프로젝트 속성에서 "비 관리 코드 디버깅 사용"옵션을 선택해야합니다. 이 후에 예외가 디버깅 프로세스에 표시됩니다. 이 코드 위의 using 절을 교체 Edit2가

예외 트리거 : 나에게 매우 이상한 소리

public void SerializeToXML(String FileName) 
{ 
    XmlSerializer fSerializer = new XmlSerializer(typeof(Configuration)); 
    Stream fStream = new FileStream(FileName, FileMode.Create, FileAccess.Write, FileShare.None); 
    try 
    { 
     fSerializer.Serialize(fStream, this); 
    } 
    finally 
    { 
     fStream.Close(); 
    } 
} 
+0

나는 (Jon처럼) 예외를 삼키고 있다고 생각합니다. 디버그 목적을 위해 try/catch를 추가하고 어딘가에 잡힌 예외를 작성하십시오 (또는 중단 점을 추가하십시오). 나는 그것이 그것을 설명 할 것 같다고 생각한다. –

+0

내 의견을 읽어 보셨나요? Marc? 내가 DirectoryNotFoundException을 삼키지 않는다면, 명시 적으로하지 않는 한이 유형의 예외를 삼켜서는 안됩니다. 저는 디버거에서 여러 번 테스트했습니다. – Wodzu

답변

1

을 - 그리고 그것을 함께 할 아무것도있다처럼 소리가 나지 않습니다 시리얼 라이저. 특정 위치에 대한 액세스 권한이없는 경우 FileStream을 만들면 예외가 발생합니다. Serialize 행까지 기다려서는 안됩니다.

문제를 숨기고있는 catch 블록이 더 높지 않은 것은 확실합니까?

+0

@ 존, 확실합니다. 존재하지 않는 폴더에 저장하려고 시도하고 DirectoryNotFoundException이 발생했는지 테스트했습니다. 어쩌면 내가 디버거 옵션 어딘가에서 제외 된이 예외가 있습니까? – Wodzu

1

using 문이 숨겨진 try-finally 구조 (Dispose() 메서드가 finally 절에서 호출 된 경우)를 사용하기 때문에 문이 의심 스럽습니다. using 블록 외부에 표시되지 않는 예외에 대한 정보는 here에서 확인할 수 있습니다.

using 문을 인스턴스화하고 Dispose() 메서드로 바꾸어보십시오. 문제가 해결 된 것 같습니다. 물론 좋은 프로그래밍 연습의 일환으로 코드를 명시 적 try-finally 구조로 묶어야합니다.

+0

+1 내 문제의 해결책에 가장 가까운 것이 었습니다. 아이러니하게도 누군가 당신에게 -1을주었습니다. – Wodzu

+0

그들은 틀렸기 때문에 아마 그에게 -1을 주었을 것입니다. using 문은 예외가 범위 외부에서 표시되지 않도록합니다. 그리고이 링크는 WCF의 디자인 결함이있는 문제와 관련이 있습니다. 닫기/삭제를하지 않는 스트림과 관련이 없습니다. – Josh

+0

하지만 제 경우에는 위에서 언급 한 디버거 옵션을 확인할 때까지 예외 발생을 방지합니다. – Wodzu

1

Vista 파일 리디렉션으로 설명 할 수 있습니다. UAC를 제대로 처리하지 못하는 레거시 프로그램이 제대로 작동하도록 허용하는 기능입니다. 파일은 가상 저장소로 리디렉션됩니다.

Visual Studio 2005 또는 이전 버전을 사용하거나 매니페스트가 exe에 포함되지 않도록하기 위해 무언가를했을 때 발생합니다. 수정 : including a manifest.

+0

고맙습니다. 방향 전환 문제가 아니 었습니다. 비 관리 코드 디버깅을 활성화해야했습니다. 두 번째 검색 후 파일이 가상 저장소 위치에 저장되었음을 인정해야합니다. 그러나 디버거 스위치를 사용한 트릭은 계속 유효합니다. – Wodzu

+0

위대한 미해결 신비의 홀에 그 설명을 올려 봅시다. 나는 당신을 가상 저장소에서 발견 할 수 있도록 구입할 것이다. –