2016-12-27 69 views
1

我有我想要保存到 “选项” 对象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(我不应该这么做),但都没有帮助。我错过了什么?

+1

我的第一个猜测是,它不是'struct'这这个问题,它只是“只读”的。反序列化的工作原理是创建一个对象的实例,然后设置其字段。我可以想象为什么这不适用于'readonly'字段。但这完全是未经测试的猜测。 – hvd

+0

你有没有试过让someValue公开,并使构造函数无参数? – gabba

回答

1

试试这个结构,在我的测试情况下,它连载正确方法:

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

因此,'私人'值可以在类但不是结构序列化?这是记录在任何地方?编辑:我相信我的问题是回答[这里](http://stackoverflow.com/questions/445915/deep-xml-serialize-a-struct-选项)。看起来没有好的方法可以使用'Settings'对对象进行深度序列化。呃,多么荒谬的设计监督。 –

2

设置序列化为XML,其中limitation不包括readonly成员。

删除readonly预选赛应该可以解决这个问题:

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

我删除了'只读',但它仍然无法正常工作。还有哪些限制可能导致这种情况? –

+0

它不会工作 – gabba

相关问题