C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

クラスや構造体をintとしてシリアル化したい /かな (18/09/11(Tue) 10:52) #88615
Re[1]: クラスや構造体をintとしてシリアル化したい /Hongliang (18/09/11(Tue) 16:35) #88620
  └ Re[2]: クラスや構造体をintとしてシリアル化したい /かな (18/09/11(Tue) 18:15) #88621 解決済み


親記事 / ▼[ 88620 ]
■88615 / 親階層)  クラスや構造体をintとしてシリアル化したい
□投稿者/ かな (1回)-(2018/09/11(Tue) 10:52:47)

分類:[.NET 全般] 

Visual Studio 2017のC#でフォームアプリケーションの開発をしています。

[プロジェクト名].Properties.Settingsを設定値の保存に利用しているのですが、
今ままでintで保存していたものの一部を、
intをラップしてプロパティを複数設けたクラスまたは構造体(どちらでもいいので以下クラスとします)に置き換えたくなりました。
前方後方両方の互換性を保たねばならないので、intからシリアル化されたものと同様、intをただ文字列にしただけのものを.configファイルに書き込みたいです。
クラスをシリアル化しようとするといろんな情報を含んだ複雑なXMLになってしまいますが、これを避ける方法はあるのでしょうか。
[ □ Tree ] 返信 編集キー/

▲[ 88615 ] / ▼[ 88621 ]
■88620 / 1階層)  Re[1]: クラスや構造体をintとしてシリアル化したい
□投稿者/ Hongliang (697回)-(2018/09/11(Tue) 16:35:37)
// どうにもこれという言葉が見当たらないようなので、
// アプリケーション設定の各プロパティのことを設定プロパティと書くことにします。

つまり、その設定プロパティが実際に読み書きする値はint1つで変わらないってことですね?
で、設定プロパティで独自の型を使用する方法もご存じであると。

であれば、まずその独自型に2つの属性を設定します。
[SettingsSerializableAs(SettingsSerializableAs.String)]
[TypeConverter(typeof(独自型コンバータ)]
public class 独自型 {
    // 略
}

それと上記の独自型コンバータを定義し、TypeConverterから派生させて
4つほどメソッドをオーバーライドします。
class 独自型コンバータ : TypeConverter {
    public override bool CanConvertFrom(引数略) {
        // sourceTypeがStringならTrue、それ以外はbase.CanConvertFromの結果を返す
    }
    public override bool CanConvertTo(引数略) {
        // destinationTypeがStringならTrue、それ以外はbase.CanConvertToの結果を返す
    }
    public override object ConvertFrom(引数略) {
        // valueがStringなら、それをintにParseして独自型のインスタンスを生成し返す
        // それ以外ならbase.ConvertFromの結果を返す
    }
    public override object ConvertTo(引数略) {
        // destinationTypeがStringでvalueが独自型なら、valueのint表現の文字列を返す
        // それ以外ならbase.ConvertToの結果を返す
    }
}

[ 親 88615 / □ Tree ] 返信 編集キー/

▲[ 88620 ] / 返信無し
■88621 / 2階層)  Re[2]: クラスや構造体をintとしてシリアル化したい
□投稿者/ かな (2回)-(2018/09/11(Tue) 18:15:50)
できました!
[SettingsSerializeAs(SettingsSerializeAs.String)] ですね、まさにこれです。
型引数を取れるSerializable属性はないかなあと思っていたところでした。

そしてTypeConverterがこんな風に使えるとは。
完全に余談ですが、TypeConverter自体はつい最近PropertyGridコントロールに独自型の内容を表示するために使ったばかりでした。

確かに型変換等に必要な情報は揃いましたが、こんなシンプルな記述だけでやりたいことが実現できてしまったのが不思議な感覚です。
属性やコンバータに関してもっと知識をつけようと思います。

必要十分かつ素早い完璧な回答をどうもありがとうございました。
解決済み
[ 親 88615 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -