c# - SettingsPropertyValue.SerializedValue 为 null,除非我通过 locals 查看变量

标签 c# serialization application-settings

我将 C# 程序中使用的一些常用设置存储在 ApplicationSettings 中。大多数设置都是字符串,但其中之一是 StringCollection

在循环遍历 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 为空,因此 ToString() 会抛出异常。

奇怪的是,当运行调试器时,SerializedValue 为 null until 我尝试在本地窗口中查看 value 变量的属性.那时,SerializedValue 包含 StringCollection 的正确 XML 序列化格式,程序继续正常运行。

为什么会这样?

最佳答案

这个问题可能源于 SerializedValue 是一个实现类似这样的属性:

public object SerializedValue
{
  get
  {
    if (this._ChangedSinceLastSerialized)
       return CalculateSerializedData();
    else
       return _cachedData;
   }
}

在我看来,在你的情况下发生的事情是,当你第一次访问 SettingPropertyValue 时,你会得到 _cachedData,然后,通过调试器查看 value,你会导致 _ChangedSinceLastSerializedtrue,这会导致对 SerializedValue 属性的下一次调用返回实际的序列化值。

下一个问题是找出为什么 _ChangedSinceLastSerialized 在您的案例中设置为 false。当用户要么访问设置(在大多数对象类型的情况下),因此例如仅像这样访问您的设置:MyAppSettings.Default.MySettingObject 会将 _ChangedSinceLastSerialized 更改为 true

如果您有类似这样的代码,可能会发生什么情况:

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

一旦你做了类似的事情并继续使用 storingObject 而不是直接访问 MyAppSettings 你可以创建一个对象在 _ChangedSinceLastSerialized 保持 false

希望对您有所帮助。

关于c# - SettingsPropertyValue.SerializedValue 为 null,除非我通过 locals 查看变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8156467/

相关文章:

.net - 无法序列化 SolidColorBrush

c# - 访问另一个项目的设置文件

windows-phone-7 - 是否可以有不同的 IndependentStorageSettings.ApplicationSettings?

C#:Unity Photon 不向第二个连接添加物理

c# - C#-为什么我的用于错误处理的包装函数无法捕获异常?

c# - 如何检查对象是否是sql to linq类型

json - 如何编写 Serde Visitor 将字符串数组转换为 Vec<Vec<f64>>?

c# - ASP.NET 核心 : Where to place Connection String for Production

php - 为每个用户分配唯一的序列号

c# - 提交应用程序设置更改