none
XmlSerializer.Serializeで共有クラスを処理したい RRS feed

  • 質問

  • 下のソースコードで、Class ConfigSettings0はインスタンスにすればXmlSerializer.Serializeで処理できますが、シングルトン(これが正しい呼称なのか?)の Class ConfigSettings1 は処理できません。

    serializer1.Serialize(sw, ConfigSettings1) の行のコンパイルエラーをなくすにはどうすれば良いのか教えて下さい。


       Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded

            Dim cf0 As New ConfigSettings0
            '保存先のファイル名
            Dim fileName As String = "C:\testsettings.txt"

            Dim serializer0 As New System.Xml.Serialization.XmlSerializer(GetType(ConfigSettings0))
            Dim serializer1 As New System.Xml.Serialization.XmlSerializer(GetType(ConfigSettings1))
            Dim sw As New System.IO.StreamWriter(fileName, False, New System.Text.UTF8Encoding(False))
            'シリアル化しXMLファイルに保存
            serializer0.Serialize(sw, cf0) 'インスタンスにするとコンパイルできる
            serializer1.Serialize(sw, ConfigSettings1) '←コンパイルエラー 'MainWindow.ConfigSettings' はクラス型であり、式として使用することはできません。

            Debug.Print(ConfigSettings1.e1)
            sw.Close()

            Me.Close()

        End Sub

        Public Class ConfigSettings0
            Public Property e1 As String = "!"
        End Class

        Public Class ConfigSettings1
            Public Shared Property e1 As String = "#"
        End Class
    2020年5月18日 6:44

回答

  • 設定自体は普通のクラスの非Sharedなプロパティに持たせるようにして、その設定クラスのインスタンスをどこかにSharedメンバとして保持するというのはいかがでしょうか。
    • 回答としてマーク huahi11112 2020年5月18日 13:02
    2020年5月18日 8:37

すべての返信

  • XmlSerializerはSharedなメンバには対応していません。

    あえてやるならそれをラップしたクラスを作成するぐらいですが…まあどうしてもということがない限りはわざわざやるようなことでもないですね。

    Public Class ConfigSettings1Wrapper
      Public Property e1 As String
        Get
          Return ConfigSettings1.e1
        End Get
        Set
          ConfigSettings1.e1 = Value
        End Set
      End Property
    End Class
    2020年5月18日 6:56
  • やっぱり「Sharedなメンバには対応しておらず、できない」という.Net Frameworkの仕様でしたか。
    設定情報を数多く持つプログラムを開発しており、それらを共有クラスにまとめています。
    レジストリーを使ってはならず、設定情報をメモ帳で変更可能にしなければならない仕様なので、テキストファイルかXMLで設定情報を管理しようと思ってXmlSerializerを採用したのですが、これでは仕様を満足できません。
    設定情報を保存するファイルの位置も、特定のフォルダー内と決められています。
    何かほかの解決手段があったら提案していただきたいです。

    仕方無く、共有クラスを使うことは諦め、設定情報クラスのインスタンスを使うことにしたいと思います。

    2020年5月18日 7:51
  • 設定自体は普通のクラスの非Sharedなプロパティに持たせるようにして、その設定クラスのインスタンスをどこかにSharedメンバとして保持するというのはいかがでしょうか。
    • 回答としてマーク huahi11112 2020年5月18日 13:02
    2020年5月18日 8:37
  • ご回答ありがとうございました。提案いただいた方法も併用しながら、しばらくはほかの幾つかのアイデアも実行に移し、コードの保守性を考えながら開発を続けることにします。

    <追記>その後作業を続けていました。御回答の意味が始めよく理解できなかったのですが、試行を繰り返して最終的にうまくいった形を見たら、御提案いただいた方法と同じになりました。Hongliangさんの御回答はズバリの解決方法ではなく、質問者に正答を導出させるためのヒントであることが多いので私も真剣に考える機会を与えられます。数年前ならば全く理解できなかったことも解るようになってきました。有り難いです。

    • 編集済み huahi11112 2020年5月18日 14:14 追記
    2020年5月18日 13:04