私は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
に保存しようとしている「オプション」オブジェクトは(とりわけ)が含まれている必要があり構造体の値
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.
}
私が0を呼び出したときの場合、すべての値が正しく設定されます(myStruct
など)。私はプログラムを再起動し、DataContext = Settings.Default.MyOptions
でオプションをロードする際に
ただし、すべての値が正しく0に_myStructを除く、デフォルト値をロードされます!
私が読んだことすべてによると、このコードは機能するはずです。私はクラス/構造体の両方に[Serializable]
属性を追加しようとしましたが、ISerializable
(これを実行する必要はありません)を実装しましたが、いずれも役に立たなかった。私は何が欠けていますか?
私の最初の推測では、それはだ 'struct'ではないということだろう問題は、 'readonly'です。脱直列化は、オブジェクトのインスタンスを作成し、そのフィールドを設定することによって機能します。私はそれが 'readonly'フィールドではうまくいかない理由を想像することができます。しかし、これは完全にテストされていない推測です。 – hvd
someValueをpublicにして、コンストラクタをパラメータなしにしましたか? – gabba