2011-11-16 2 views
3

ApplicationSettings 안에 C# 프로그램에 사용 된 몇 가지 공통 설정을 저장합니다. 대부분의 설정은 문자열이지만 그 중 하나는 StringCollection입니다.SettingsPropertyValue.SerializedValue는 지역 변수를 통해 변수를 보지 않는 한 null입니다.

아래 표시된 것처럼 Properties.Settings.Default의 기본 설정을 반복하고이를 매개 변수로 보내기 위해 사전에 추가하는 일부 코드에서 예외가 발생합니다.

// Generate parameters 
Dictionary<string, string> signalparams = new Dictionary<string, string>(); 

// Add parameters 
foreach (SettingsProperty property in Properties.Settings.Default.Properties) 
{ 
    SettingsPropertyValue value = new SettingsPropertyValue(property); 

    if (value.Property.SerializeAs == SettingsSerializeAs.Xml) 
    { 
     // Here's where the error occurs 
     signalparams.Add(value.Name, value.SerializedValue.ToString()); 
    } 
    else if (value.Property.SerializeAs == SettingsSerializeAs.String) 
    { 
     signalparams.Add(value.Name, value.PropertyValue.ToString()); 
    } 
} 

문자열 설정 미세 첨가되지만, 그것은 StringCollection 도달하면 (정확하게) 속성이 SerializeAs == SettingsSerializeAs.Xml이 있는지 평가한다. 그러나 SerializedValue은 null이므로 ToString()이 예외를 throw합니다.

이상한 것은 디버거를 실행할 때 나는 지역 주민 창에 value 변수의 속성을 확인하려고 때까지 SerializedValue가 null이다. 이 시점에서 SerializedValue에는 StringCollection에 대한 올바른 XML serialize 된 형식이 포함되어 있으며 프로그램은 정상적으로 처리됩니다.

왜 이런 일이 발생합니까?

답변

2

문제는 SerializedValue 그런 식으로 뭔가를 구현하는 속성이 있다는 사실에서 아마 줄기는 :

귀하의 경우에는 어떻게됩니까
public object SerializedValue 
{ 
    get 
    { 
    if (this._ChangedSinceLastSerialized) 
     return CalculateSerializedData(); 
    else 
     return _cachedData; 
    } 
} 

, 내 의견으로는, 때 먼저 _cachedData를 얻고 있다는 것입니다 SettingPropertyValue에 액세스 한 다음 디버거를 통해 value을 보면 _ChangedSinceLastSerializedtrue이되어 다음에 SerializedValue 속성을 호출하면 실제 직렬화 된 값이 반환됩니다.

다음 질문은 귀하의 경우 _ChangedSinceLastSerializedfalse으로 설정된 이유를 확인하는 것입니다. SettingsPropertyValue의 논리는 _ChangedSinceLastSerialized이 (대부분의 객체 유형의 경우) 설정에 액세스 할 때 _ChangedSinceLastSerialized이 true로 설정되어 있기 때문에 (예 : 클래스의 PropertyValue 속성의 리플렉터에서 볼 수 있음) : MyAppSettings.Default.MySettingObject는 _ChangedSinceLastSerializedtrue으로 변경합니다.

이 유사한 코드가 귀하의 경우에 일어날 수있는 어떤

: 당신이 그런 짓을하고 storingObject를 사용하는 대신 직접 MyAppSettings 접근 유지되면

object storingObject = MyAppSettings.Default.MySettingObject; 
// Now I will use storingObject to access the setting. 

당신이 객체가 변경되는 상황을 만들 수 있습니다 _ChangedSinceLastSerializedfalse입니다.

도움이 되었기를 바랍니다.

+0

감사합니다.지금까지는 내가 보여준 것처럼 설정에서 객체를 가져 오지 않았습니다. 이전 설정을 수정하지 않고 직렬화 된 값을 가져 오려고합니다. 객체가 직렬화되지 않더라도'_ChangedSinceLastSerialized'의 기본값은'false'입니다. 그럼에도 불구하고 객체를 수동으로 직렬화하여이 문제를 해결했습니다. – voithos

0

실제로 나는 SettingsPropertyValue을 사용하려고 시도하지 않았으며 객체를 XML로 수동 직렬화하기로 결정했습니다. 나는 SettingsProperty.NameProperties.Settings.Default에 저장된 설정의 값을 검색하는 키로 사용했습니다. 이는 사전 형 객체이기 때문입니다. 문제는 해결되었지만 근본 원인은 여전히 ​​알려지지 않았습니다. 수정 된 코드는 다음과 같습니다.

// Generate parameters 
Dictionary<string, string> signalparams = new Dictionary<string, string>(); 

// Add parameters 
foreach (SettingsProperty property in Properties.Settings.Default.Properties) 
{ 
    if (property.SerializeAs == SettingsSerializeAs.String) 
    { 
     signalparams.Add(property.Name, Properties.Settings.Default[property.Name].ToString()); 
    } 
    else if (property.SerializeAs == SettingsSerializeAs.Xml) 
    { 
     // Serialize collection into XML manually 
     XmlSerializer serializer = new XmlSerializer(Properties.Settings.Default[property.Name].GetType()); 

     StringBuilder sb = new StringBuilder(); 
     XmlWriter writer = XmlWriter.Create(sb); 

     serializer.Serialize(writer, Properties.Settings.Default[property.Name]); 
     writer.Close(); 

     signalparams.Add(property.Name, sb.ToString()); 
    } 
} 
관련 문제