为什么我不能序列化带有结构的对象?

时间:2016-12-27 20:31:28

标签: c# wpf

我有一个“选项”对象,我正试图保存到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-value

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(我不应该这样做),但都没有帮助。我错过了什么?

2 个答案:

答案 0 :(得分:2)

设置被序列化为XML,其中limitationreadonly成员被排除在外。

删除readonly限定符应解决此问题:

public struct MyStruct {
    internal int _someValue;
    public MyStruct(int someValue) {
        _someValue = someValue;
    }
}

答案 1 :(得分:1)

尝试这个结构,在我的测试用例中它以正确的方式序列化:

public struct MyStruct
{
    public int SomeValue { get; set; }
}