我有我想要保存到 “选项” 对象Settings
为什么我不能序列化一个结构体中的对象?
public class MainWindow
{
public MyOptions MyOptions => (MyOptions)DataContext;
public MainWindow()
{
InitializeComponent();
DataContext = Settings.Default.MyOptions ?? new MyOptions();
}
private void OnOptionsChanged(object sender, PropertyChangedEventArgs e)
{
Settings.Default.MyOptions = MyOptions;
Settings.Default.Save();
}
// etc.
}
MyOptions
包含(除其他事项外)一个struct值
public class MyOptions
{
private MyStruct _myStruct;
public MyOptions()
{
_myStruct = someDefaultValue;
}
// etc.
}
MyStruct
只包含一台int:
public struct MyStruct
{
private readonly int _someValue;
public MyStruct(int someValue)
{
_someValue = someValue;
}
// etc.
}
当我拨打Settings.Default.MyOptions = MyOptions;
,所有的值都设置正确,包括myStruct
。
然而,当我重新启动该程序,并与DataContext = Settings.Default.MyOptions
加载选项,所有的值是否正确装入除了_myStruct,默认为0!根据我读过的所有内容,这段代码应该可以工作。我已经尝试将[Serializable]
属性添加到类/结构中,并且执行ISerializable
(我不应该这么做),但都没有帮助。我错过了什么?
我的第一个猜测是,它不是'struct'这这个问题,它只是“只读”的。反序列化的工作原理是创建一个对象的实例,然后设置其字段。我可以想象为什么这不适用于'readonly'字段。但这完全是未经测试的猜测。 – hvd
你有没有试过让someValue公开,并使构造函数无参数? – gabba