2016-12-27 1 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に保存しようとしている「オプション」オブジェクトは(とりわけ)が含まれている必要があり構造体の値

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(これを実行する必要はありません)を実装しましたが、いずれも役に立たなかった。私は何が欠けていますか?

+1

私の最初の推測では、それはだ 'struct'ではないということだろう問題は、 'readonly'です。脱直列化は、オブジェクトのインスタンスを作成し、そのフィールドを設定することによって機能します。私はそれが 'readonly'フィールドではうまくいかない理由を想像することができます。しかし、これは完全にテストされていない推測です。 – hvd

+0

someValueをpublicにして、コンストラクタをパラメータなしにしましたか? – gabba

答えて

1

は、この構造体を試してみてください、私のテストケースでは、正しい方法を連載:

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

'private'値はクラスではシリアル化できますが、構造体ではシリアル化できません。これはどこに文書化されていますか?編集:私は私の質問は[ここ](http://stackoverflow.com/questions/445915/deep-xml-serialize-a-struct-options)に答えていると信じています。 'Settings'を使ってオブジェクトの深い直列化を行う良い方法はないようです。うーん、なんてばかげたデザインの監督。 –

2

設定はXMLとしてシリアライズされ、limitationのメンバーがreadonlyで除外されています。 readonly修飾子を削除

は、この問題を解決する必要があります

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

'readonly'を削除しましたが、まだ動作していません。これを引き起こす可能性のある他の制限は何ですか? –

+0

これはうまくいきません – gabba

関連する問題