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

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

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

Re[2]: クラスや構造体をintとしてシリアル化したい


(過去ログ 152 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■88615 / inTopicNo.1)  クラスや構造体をintとしてシリアル化したい
  
□投稿者/ かな (1回)-(2018/09/11(Tue) 10:52:47)

分類:[.NET 全般] 

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

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

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

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

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

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


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -