2009-12-15 3 views
4

목표는 앱간에 구성 설정을 공유하는 것입니다. 예를 들어 WinForm 앱을 사용하여 설정을 저장하고 저장할 수 있고 콘솔 앱이 해당 설정을 읽고 예약 된 작업으로 실행할 수있게하려고합니다. 내가 시도한 접근 방식은 Winform 응용 프로그램과 콘솔 응용 프로그램에서 모두 참조되는 SharedSettings 클래스를 만드는 것입니다. 이 클래스에는 공용 문자열 속성이 있습니다.클래스를 직렬화 할 때 XMLSerializer가 잘못된 XML을 작성합니다 (간혹)

public class SharedSettings 
{ 
    public string URL { get; set; } 
    public string DestUser { get; set; } 
    public string RelScript { get; set; } 
} 

나는이 SharedSettings 클래스

SharedSettings settings = new SharedSettings(); 

settings.RelScript = this.txtRelScript.Text; 
settings.URL = this.txtURL.Text; 
settings.DestUser = this.txtDestUser.Text; 

XmlSerializer dehydrator = new XmlSerializer(settings.GetType()); 
System.IO.FileStream fs = new FileStream(this.configFilePath, FileMode.OpenOrCreate); 
dehydrator.Serialize(fs, settings); 

의 인스턴스를 직렬화하려면 다음을 사용하고이 그것을 역 직렬화하고, A 형의

SharedSettings settings = new SharedSettings(); 
XmlSerializer dehydrator = new XmlSerializer(settings.GetType()); 
System.IO.FileStream fs = new FileStream(this.configFile, FileMode.Open); 
settings = (SharedSettings)dehydrator.Deserialize(fs); 

this.txtRelScript.Text = settings.RelScript; 
this.txtURL.Text = settings.URL; 
this.DestUser.Text = settings.DestUser; 

마다 한 번에 필드를 채 웁니다 5 번 중 5 번은 유효한 XML로 작성된 XML 파일을 실행합니다. 여기에 예제가 있습니다

<?xml version="1.0"?> 
<SharedSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<ProjectName>test2</ProjectName> 
<URL /> 
<DestUser>test3</DestUser> 
<RelScript>D:\Events.dll</ReleaseScript> 
</SharedSettings>ttings> 

마지막 줄을 확인하십시오. ttings> 수업을 연재 할 때 내가 뭘 잘못하고 있니?

답변

15

이전 실행 과정에서 더 긴 파일을 작성한 것처럼 보입니다. serialization 코드에 FileMode.OpenOrCreate을 사용하더라도 이전 파일이 잘리지 않으므로 부분적으로 덮어 씁니다.

대신 FileMode.Create을 사용하십시오.

here 문서를 참조하십시오.

+0

또한 OP는 파일 스트림이 플러시되고 닫히도록하기 위해'fs' 문을'using' 문에 넣어야합니다. – dbc

-1

설정에서 일련 번호를 지정하는 코드에서 fs.Flush() 또는 fs.Close()를 호출하고 있습니까?

파일이 "닫힌 상태"가 아닌 것 같습니다.

예를 들어, 열어 본 파일에 이번에 작성한 데이터가 더 많은 것처럼 보입니다. (그 말이 맞는지 확실하지 않은 경우 ...) 파일을 제대로 닫지 않았기 때문에 파일이 올바른 위치에서 끝나지 않습니다. '

"Hello World!" 

그리고 두 번째는 적은 바이트를 작성하고 돈 :

하면, 파일을 쓰기

처음 당신을 가정 해 봅시다 작성 ... 나는 그 더 설명 할 수 있는지 볼 수 있습니다 파일을 올바르게 닫지 마십시오. 그래서 "안녕 밥"이라고 쓰면. 당신은 얻을 것이다 : fs.Close를가() 문제가 해결되지 않으면

"Hi Bob.orld!" 

, 당신은 당신이 그것을 쓰기 전에 설정 때마다 파일 삭제 중 시도 할 수 있습니다.

SharedSettings settings = new SharedSettings(); 

    settings.RelScript = this.txtRelScript.Text; 
    settings.URL = this.txtURL.Text; 
    settings.DestUser = this.txtDestUser.Text; 

    XmlSerializer dehydrator = new XmlSerializer(settings.GetType()); 
    using (System.IO.FileStream fs = new FileStream(this.configFilePath, FileMode.OpenOrCreate)) 
    { 
     dehydrator.Serialize(fs, settings); 
    } 

그렇게하지의 결과가 제대로 출력 스트림을 플러시되지 않은 것입니다 :

-1

using 블록을 사용하는 방법에 대해 알아보세요.

관련 문제