2016-04-26 12 views
0

設定を読み込もうとするとエラーが発生します。私はどこかで間違って書くことを知っています。私は多くの情報を見つけることができなかったので、一人で行うべき手続き。設定xml StackOverflowExceptionエラー

<?xml version="1.0" encoding="utf-8"?> 
<propertyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <serverName>1</serverName> 
    <databaseName>Kadir</databaseName> 
    <user>as</user> 
    <gridHeight>40</gridHeight> 
</propertyClass> 
+0

エラーは何ですか? – leppie

+0

エラーの詳細とsettings.xmlファイルの内容を教えてください。 – abrown

答えて

2

私はあなたのpropertyClassの中で最終的にStackOverflow例外(propertyClass内のpropertyClassのインスタンスであるproSave.okuを参照する)を引き起こすループを引き起こしていると思います。あなたのpropertyClassでこの参照を削除すると、あなたの問題を修正 - それはあるとしてあなたのコードの残りの部分を残すことができ:

[Serializable] 
public class propertyClass 
{ 
    [Description("Server Bağlantı Adı"), Category("Server Setting")] 
    public string serverName { get; set; } 

    [Description("Server Bağlantısı Dosya Adı"), Category("Server Setting")] 
    public string databaseName { get; set; } 

    [Description("Server Bağlantısı kullanıcı adı"), Category("Server Setting")] 
    public string user { get; set; } 

    [Description("Server Bağlantısı kullanıcı şifresi"), Category("Server Setting")] 
    public string password { get; set; } 

    [Description("Grid Hücre Yükseklik Ayarı \nFormlar Yenilendiğinde etkinleştirilecektir."), Category("Grid Ayarları")] 
    public int gridHeight { get; set; } 
} 

XMLファイルを毎回読ん防ぐために、実装を拡張したい場合は、さらにあなたを修正することができます「キャッシュ」にProSaveのクラスの設定、例えば:SaveSettings()メソッドに戻って設定を書き込む際に、ファイルがロックされていた場合

public static class proSave 
{ 
    private static propertyClass settings; 

    private const string SettingsFilePath = "C:\\settings.xml"; 

    public static propertyClass oku 
    { 
     get 
     { 
      if (settings == null) 
      { 
       settings = GetSettings(); 
       return settings; 
      } 

      return settings; 
     } 
    } 

    public static void SaveSettings(propertyClass settings) 
    { 
     XmlSerializer writer = new XmlSerializer(typeof(propertyClass)); 

     using (FileStream file = File.Create(SettingsFilePath)) 
     { 
      writer.Serialize(file, settings); 
     } 
    } 

    private static propertyClass GetSettings() 
    { 
     XmlSerializer serialize = new XmlSerializer(typeof(propertyClass)); 

     using (var stream = new StreamReader(SettingsFilePath)) 
     { 
      return (propertyClass)serialize.Deserialize(stream); 
     } 
    } 
} 

あなたはIOExceptionsを処理する必要があります。

組み込みのConfigurationManagerを使用するか、カスタムConfigurationSectionを実装するなど、代替案を検討することもできます。お役に立てれば。

+0

多くの読み書き操作で、他のパスに従うにはどうすればよいですか? –

+0

申し訳ありませんが、私はあなたの質問を理解していない - 少し詳細を提供することができます、ありがとう。 – abrown

+0

私はできることが自動的に設定の書き込みと読み取りの操作の方法がありますか?ここでの目的はファイルを常に開いたり閉じたりして、恩恵を受ける方法で慰めます。私はGoogle翻訳で書いています。 –

0
<?xml version="1.0" encoding="utf-8"?> 
<propertyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <serverName>1</serverName> 
    <databaseName>Kadir</databaseName> 
    <user>as</user> 
    <gridHeight>40</gridHeight> 
</propertyClass> 

例外のSystem.StackOverflowException」タイプがスローされる:

//設定コード

コード

namespace property 
     { 
     [Serializable] 
     public class propertyClass 
     { 
      private string _serverName = proSave.oku.serverName; 
      [Description("Server Bağlantı Adı"), Category("Server Setting")] 
      public string serverName { get { return _serverName; }} 

      private string _databaseName = proSave.oku.serverName; 
      [Description("Server Bağlantısı Dosya Adı"), Category("Server Setting")] 
      public string databaseName { get { return _serverName; } } 

      private string _user = proSave.oku.user; 
      [Description("Server Bağlantısı kullanıcı adı"), Category("Server Setting")] 
      public string user { get { return _user; } } 

      private string _password = proSave.oku.password; 
      [Description("Server Bağlantısı kullanıcı şifresi"), Category("Server Setting")] 
      public string password { get { return _password; } } 

      private int _gridHeight = proSave.oku.gridHeight; 
      [Description("Grid Hücre Yükseklik Ayarı \nFormlar Yenilendiğinde etkinleştirilecektir."), Category("Grid Ayarları")] 
      public int gridHeight { get { return _gridHeight; } } 


     } 
    } 

XMLを適用する設定

public static class proSave 
    { 
     public static propertyClass oku 
     { 
      get 
      { 
       XmlSerializer serialize = new XmlSerializer(typeof(propertyClass)); 
       var stream = new StreamReader("settings.xml"); 
       return (propertyClass)serialize.Deserialize(stream); 

      } 
     } 
    } 

をお読みください。

+0

質問の下にある[編集]リンクを使用して、追加情報を追加してください。 Answerボックスにそれを書き込まないでください。これはあなたが尋ねた質問に答える唯一の貢献です。 Stack Overflowは典型的な "フォーラム"ではありません。 –