2017-04-18 21 views
0

設定がいつでも変更される可能性があるため、設定ファイルにはいくつかのメイン設定を保存したかっただけです。 私のアプリケーションのユーザーは、いくつかの環境でいくつかのものを管理することができます。 各環境には独自の構成(基本的にネットワークロケーションへのパス)があります。C# - 設定ファイルに構造体を格納する

私は環境ごとに構造体を構築しましたが、ここでいくつかの環境を追加する必要があるため、その設定をソースコードの外に保存すると便利です。

だから、いくつかのコードを教えてください。

public struct env_conf 
{ 
    string title; 
    string path_to_xml; 
    string path_to_sharepoint; 
    List<subfolder> subfolders; 
    //Some more strings 

    public env_conf(string title, string path_to_xml, string path_to_sharepoint ...) 
    { 
    //Constructor which is setting the variables 
    } 
} 

public struct subfolder 
{ 
    string folder; 
    bool is_standard; 

    public env_conf(string folder, bool is_standard) 
    { 
    //Constructor which is setting the variables 
    } 
} 

そして、これは環境のconfigsが設定されている方法です:私は、それぞれの環境を記述するための2つの構造体を構築し

var finance_conf = new env_conf("MyTitle","MyXMLPath","MySPPath", 
new List<subfolder>{new subfolder("MySubFolder",true);new subfolder("MySubFolder2",false)} 
); 

var sales_conf = new env_conf("MySalesTitle","MySalesXMLPath","MySalesSPPath", 
new List<subfolder>{new subfolder("MySalesSubFolder",true);new subfolder("MySalesSubFolder2",false)} 
); 

この最後のステップ - 設定 - インスタンスの定義は、今の内側にあるもの設定ファイル

設定ファイルにstringstring[]を保存することは今まで私にとっては問題ありませんでした。しかし、今私はそれ以上のものを持っています...

以上、私はVisual Studioを持っていません。私はSharpDevelopで作業しています。

私の構造体をシリアライズ可能とマークするのは役に立ちませんでした。また、手動で設定のタイプをMyNamespace.env_confに設定すると、設定デザイナーには表示されません。「?」のみです。タイプフィールドに表示されます。 今のところ、私はどのように進むべきか分かりません。また、私がインターネットで見つけたすべての情報は私を助けてくれないようです。私を助けてください。

私のXML設定ファイルはどのように編集されますか? ソースコードの編集方法は?

おはようございます!

+1

なぜクラスではなく構造体を使用していますか?シリアライゼーションの何が問題になっていますか? –

+0

クラスでもいいですね。私は変数と関数を持たないので、構造体は同じことをします。 なぜシリアル化がうまくいかないのか分からないので、私は尋ねています。 – xola

+0

なぜあなたのシリアル化がうまくいかないのか分かりません。なぜなら*あなたが属性を設定する以外に何をしているのか記述していないからです。 – grek40

答えて

0

シリアライズ可能なクラスを作成すると、設定ファイルがクラスのインスタンスにデシリアライズされ、すべての設定が適用されます。

例えば、クラスは次のようになります。

[Serializable] 
public class EnvironmentConfig 
{ 
    public string Title { get; set; } 
    public string XmlPath { get; set; } 
    public string SharepointPath { get; set; } 
    public List<SubFolder> SubFolders { get; set; } 
    public override string ToString() 
    { 
     return $"{Title}: {XmlPath}, {SharepointPath}, {string.Join(", ", SubFolders.Select(s => s.Folder))}"; 
    } 
} 

[Serializable] 
public class SubFolder 
{ 
    public string Folder { get; set; } 
    public bool IsStandard { get; set; } 
} 

そしてコードでは、あなたは、あなたのクラスのインスタンスを作成し、それをいくつかの値を与え、設定ファイルにそれをシリアライズすることができます。後でこのファイルを逆シリアル化して、ユーザーが行った変更をロードできます。

この例では、デフォルトのconfigを作成し、その値をコンソールに表示します。次に、ユーザーにファイルを変更する機会を与え、新しい値を表示します。

// Create a default config 
var defaultEnvCfg = new EnvironmentConfig 
{ 
    Title = "USWE Environment", 
    XmlPath = @"\\server\share\xmlfiles", 
    SharepointPath = @"\\server\sites\enterpriseportal\documents", 

    SubFolders = new List<SubFolder> 
    { 
     new SubFolder { Folder = "Folder1", IsStandard = true }, 
     new SubFolder { Folder = "Folder2", IsStandard = false } 
    } 
}; 

// Display original values: 
Console.WriteLine(defaultEnvCfg.ToString()); 

// Serialize the config to a file 
var pathToEnvCfg = @"c:\public\temp\Environment.config"; 
var serializer = new XmlSerializer(defaultEnvCfg.GetType()); 

using (var writer = new XmlTextWriter(
    pathToEnvCfg, Encoding.UTF8) { Formatting = Formatting.Indented }) 
{ 
    serializer.Serialize(writer, defaultEnvCfg); 
} 

// Prompt user to change the file 
Console.Write($"Please modify the file then press [Enter] when done: {pathToEnvCfg}"); 
Console.ReadLine(); 

// Deserialize the modified file and update our object with the new settings 
using (var reader = XmlReader.Create(pathToEnvCfg)) 
{ 
    defaultEnvCfg = (EnvironmentConfig)serializer.Deserialize(reader); 
} 

// Display new values: 
Console.WriteLine(defaultEnvCfg.ToString()); 

Console.Write("\nDone!\nPress any key to exit..."); 
Console.ReadKey(); 
関連する問題