2016-05-02 14 views
1

初めてXMLシリアル化を試みました。次のコードは期待通りに機能しますが、私はこの "copyFrom"メソッドを使用したくありません。クラス内のXMLの逆シリアル化

クラス自体の内部に保存メソッドとロードメソッドを保持する良い方法はありますか?

namespace Test 
{ 
    [Serializable] 
    public class Settings 
    { 
     public struct Connection 
     { 
      [XmlAttribute ("user")] 
      public string sUser; 

      [XmlAttribute ("domain")] 
      public string sDomain; 
     } 

     public Connection connection; 

     public Settings() 
     { 
      connection.sUser = ""; 
      connection.sDomain = ""; 
     } 

     internal void loadFromFile() 
     { 
      if (File.Exists (Constants.STORAGE_SETTINGS_FILE)) 
      { 
       using (FileStream filestream = new FileStream (Constants.STORAGE_SETTINGS_FILE, FileMode.Open, FileAccess.Read, FileShare.Read)) 
       { 
        copyFrom ((Settings)new XmlSerializer (typeof (Settings)).Deserialize (filestream)); 
       } 
      } 
     } 

     internal void saveToFile() 
     { 
      using (StreamWriter streamwriter = new StreamWriter (Constants.STORAGE_SETTINGS_FILE)) 
      { 
       new XmlSerializer (typeof (Settings)).Serialize (streamwriter, this); 
      } 
     } 

     internal void copyFrom (Settings settings) 
     { 
      connection.sUser = settings.connection.sUser; 
      connection.sDomain = settings.connection.sDomain; 
     } 
    } 
} 
+1

あなたは何を意味するのか分かりません。彼らはクラスに属していますか、別のクラスを意味していますか? –

+0

私は "copyFrom"を避け、ロードされた値をメンバー変数に直接割り当てたいと思います。 –

+0

serializeの結果はクラスを返し、プロパティをthis.sUserおよびthis.sDomainに移動するコードが必要です。またはこれらの変数を静的にする必要があります。 – jdweng

答えて

0

copyFromメソッドを削除できます。 loadFromFile方法で

、あなたが

connection = ((Settings)new XmlSerializer(typeof(Settings)).Deserialize(filestream)).connection; 


を書くことができます。またSerializable属性はXMLシリアル化のために必要ではないことに注意してください。それを除く。

+0

これは「接続」構造体で機能しますが、シリアル化されたオブジェクト全体で機能する方法もありますか?私は "this =(Settings)new XmlSerializer(typeof(Settings))。Deserialize(filestream)"のようなものを探しています。これは "this"が読み取り専用なので原因では機能しません。私はちょうどシリアル化されたメンバー(現時点では2つの文字列ですが、もうすぐです)を再度リストしたくありません。 –

+0

@André - あなたのアプリのデザインを変更します。オブジェクトは自分自身をセーブ/ロードしてはいけません。より高いレベルでそれを行う。 –

関連する問題