web-dev-qa-db-ja.com

アプリケーション設定でオブジェクトのリストを保存する方法

最近、C#アプリケーションの設定に慣れてきましたが、かっこいいようです。
カスタムオブジェクトのリストを保存する方法を探していましたが、方法が見つかりませんでした。
実際に int [] を格納するための投稿を見ましたが、この問題には役立ちませんでした。
問題に適したものにするために、そのソリューションの構成を変更しようとしました。そのXML構成ファイルは次のとおりです。

<Setting Name="SomeTestSetting" Type="System.Int32[]" Scope="User">
  <Value Profile="(Default)" />
</Setting>

以下のtype属性で引用されているようにオブジェクトをアドレス指定しようとしましたが、オブジェクトを認識しないため役に立ちませんでした...「type = List」と「type = "Tuple []」を試しました
これらのオプションはどちらも役に立ちませんでした。

私は次のようなクラスを持っています:

class Tuple
    {
        public Tuple()
        {
            this.font = new Font ("Microsoft Sans Serif",8);
            this.backgroundcolor_color = Color.White;
            this.foregroundcolor_color = Color.Black;
        }
        public string log { get; set; }
        public Font font { get ; set; }
        public String fontName { get; set; }
        public string foregroundcolor { get; set; }
        public Color foregroundcolor_color { get; set; }
        public string backgroundcolor { get; set; }
        public Color backgroundcolor_color { get; set; }
        public Boolean notification { get; set; }
    }

そして、アプリケーション設定にリストを保存したいと思います。
それで、この目的を達成する方法はありますか。
前もって感謝します。
乾杯、

16
Ehsan

BinaryFormatter を使用してタプルのリストをバイト配列としてシリアル化し、Base64(非常に効率的な方法として)を使用してバイト配列をstringとして格納できます。

まず、クラスをそのようなものに変更します(ヒント: [SerializableAttribute] ):

[Serializable()]
public class Tuple
{
    public Tuple()
    {
        this.font = new Font("Microsoft Sans Serif", 8);
    //....
}

tuplesという名前の設定とstringのタイプにプロパティを追加します。

tuples in Settings

次に、2つの方法を使用して、タプルの汎用リストをロードおよび保存できます(List<Tuple>):

void SaveTuples(List<Tuple> tuples)
{
    using (MemoryStream ms = new MemoryStream())
    {
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(ms, tuples);
        ms.Position = 0;
        byte[] buffer = new byte[(int)ms.Length];
        ms.Read(buffer, 0, buffer.Length);
        Properties.Settings.Default.tuples = Convert.ToBase64String(buffer);
        Properties.Settings.Default.Save();
    }
}

List<Tuple> LoadTuples()
{
    using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(Properties.Settings.Default.tuples)))
    {
        BinaryFormatter bf = new BinaryFormatter();
        return (List<Tuple>)bf.Deserialize(ms);
    }
}

例:

List<Tuple> list = new List<Tuple>();
list.Add(new Tuple());
list.Add(new Tuple());
list.Add(new Tuple());
list.Add(new Tuple());
list.Add(new Tuple());

// save list
SaveTuples(list);

// load list
list = LoadTuples();

null、空の文字列、例外チェックはあなたに任せます。

36
Michał Powaga

アプリケーションの構成は、アプリケーションの実行時にデータを保存するのに適していません。このために、次のような.NETシリアル化オプションで利用可能なものを使用します

と他の多くの...

3
Tigran

あなたが何をしたいのかは、アプリケーションの設定で行うのが最善かどうかわかりません。調べたいのはXDocumentで、必要な値を別の構成ファイルに保存します。

0
Hammerstein

カスタムタイプを記述して、.configファイルを拡張できます。ただし、これは、確認の既存のセクションに独自の任意のタイプを格納するのではなく、カスタムセクションを追加します。

カスタム構成タイプは、子ノードに完全にカスタムロジックを提供することにより、XMLシリアル化データを保持できます。これは構成システムを悪用していると私は主張します。これは、完全な状態ではなく設定を保存するためのものです。

これが必要な場合は、ドキュメントに ConfigurationSection の簡単な例があります。

0
Richard