午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

シリアライズ、クラス、オブジェクトの設定の保存

クラス、オブジェクトの設定の保存して復元のテスト

やってみたいこと、目的は
Pixtack紫陽花での文字の描画で文字の設定を保存しておいて
次回にアプリを起動した時に設定を反映するようにしたい
終了時の設定を復元したい
起動するたびにフォント名や色、大きさ、影の有無とかを指定するのが面倒
一個だけの設定なら前回の
フォントの色赤とフォントの色青とか両方の保存はできなさそう
調べていてシリアライズってのを使うとできそうってことになった
そのシリアライズの中でもバイナリ形式で保存が良さそう
テストしてみた
数値と文字列と色の値を持つ適当なクラスを作成、テストなので後処理とかは省いている
 
'↓<Serializable>をつけるとこの直下に書いてあるクラスはシリアライズ(バイナリ版)できることになる
<Serializable>
Public Class TestClassテスト用クラス
    Public Number数値 As Integer
    Public Message文字列 As String
    Public _col色 As Color
    Private caアルファ As Integer
    Public cr赤 As Integer
    Public cg緑, cb青 As Integer
    Public Property col As Color
        Get
            Dim c As Color = Color.FromArgb(caアルファ, cr赤, cg緑, cb青)
            Return c
        End Get
        Set(value As Color)
            _col色 = value
            caアルファ = value.A
            cr赤 = value.R
            cg緑 = value.G
            cb青 = value.B

        End Set
    End Property
End Class

’ここから下は普通のForm1クラス
Imports System.Configuration
Imports System.IO
Imports System.Runtime.Serialization.Formatters.Binary

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim obj As New TestClassテスト用クラス()
        obj.Message文字列 = "testdesu"
        obj.Number数値 = 123
        obj.col = Color.FromArgb(128, 3, 88, 23)

        'シリアライズ(XML版)、こっちはColorが保存されない、Privateな変数も保存されないで無視される
        Dim fileName As String = "F:\png\sample.xml"
        Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(TestClassテスト用クラス))
        Dim sw As New System.IO.StreamWriter(fileName, False, New System.Text.UTF8Encoding(False))
        serializer.Serialize(sw, obj)
        sw.Close()


        'シリアライズ(バイナリ版)
        Dim fs As New FileStream("F:\png\data.bin", FileMode.Create)
        Dim bf As New BinaryFormatter
        bf.Serialize(fs, obj)
        fs.Close()

        'デシリアライズ(バイナリ版)
        Dim obj2 As New TestClassテスト用クラス()
        Dim fs2 As New FileStream("F:\png\data.bin", FileMode.Open)
        Dim bf2 As New BinaryFormatter
        obj2 = bf2.Deserialize(fs2)
        fs2.Close()

    End Sub
End Class
 

画像だとこう

f:id:gogowaten:20191017115802p:plain

f:id:gogowaten:20191017115815p:plain

デザイン画面はボタンを一個追加しただけ
ボタンを押すとシリアライズ開始
F:\png\sample.xmlxmlのファイルが保存される
F:\png\data.binにバイナリのファイルが保存される
 
結果
xmlでは今回の目的には合わなかったけど
保存したファイルを開いてみてみる

<?xml version="1.0" encoding="utf-8"?>
  <Number>123</Number>
  <Message>testdesu</Message>
  <cr>3</cr>
  <cg>88</cg>
  <cb>23</cb>
  <col />
</SampleClass>

こうなっている
記録されていない項目がある
色のColorとcaアルファが記録されていない
caアルファは他の「Number数値]と同じinteger型の変数(フィールド?)なんだけど
Privateで宣言しているから記録されないみたい
Color型の変数も無視される
ってことでxmlシリアライズするのは目的には合わない
 
次はバイナリ形式にシリアライズこっちは期待通り
メモ帳で開くと

             g繧キ繝ェ繧「繝ゥ繧、繧コ繝・す繝ェ繧「繝ゥ繧、繧コ繝・せ繝・ Version=1.0.0.0, Culture=neutral, PublicKeyToken=null   QSystem.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a   O繧キ繝ェ繧「繝ゥ繧、繧コ繝・す繝ェ繧「繝ゥ繧、繧コ繝・せ繝・TestClass繝・せ繝育畑繧ッ繝ゥ繧ケ   Number謨ー蛟、Message譁・ュ怜・_col濶イca繧「繝ォ繝輔ぃcr襍、cg邱・cb髱・    System.Drawing.Color     {     testdesu・System.Drawing.Color   namevalue
knownColorstate     
X€       €     X      

こうだけどデシリアライズで復元されたところを
ブレークポイントに指定しておいてからアプリを実行して
イメージ 3
ボタンを押してシリアライズとデシリアライズを実行

f:id:gogowaten:20191017115859p:plain

ブレークポイントで一時停止するので
シリアライズで復元されたものを入れたobj2の中身をローカルウィンドウで見てみるとColorやPrivateで宣言したcaアルファも復元されているのがわかった!
 
ローカルウィンドウの表示もメモ

f:id:gogowaten:20191017115912p:plain

メニューのデバッグ→ウィンドウ→ローカルで表示される
 
これでシリアライズってのを使えばクラス自体をファイルにして保存して
そのファイルを読み込んで復元できるのがわかった(ほんとに?)
ここまでだと一個しか保存できていないようなものだから
今度はこれを複数にしたい
具体的にどうすればいいか思いつかないけどなんとか
 
 
次回

参照したところ