XMLファイルのC#の問題は、デシリアライズする際、ベースクラスがインスタンスとして派生クラスで使用します

基本クラス:

使用してシステムを。
使用してSystem.Collections.Genericを。
使用してSystem.Linqのを。
使用してSystem.Textのを。

名前空間DeserializeTest 
{ 
    パブリック クラスSettingsBase 
    { 
        プライベート 文字列m_fileName。

        公共 文字列ファイル名は
        { 
            取得 { リターンm_fileNameを。}
             集合 {m_fileName = 値。} 
        } 
            
    } 
}

派生クラス:

使用してシステムを。
使用してSystem.Collections.Genericを。
使用してSystem.Linqのを。
使用してSystem.Textのを。

名前空間DeserializeTest 
{ 
    パブリック クラスWorldWindSettings:SettingsBase 
    { 
        パブリックWorldWindSettings() ベース()
        { 
        } 


        プライベート ストリング m_proxyUrl = "" ; 

        公共の 文字列ProxyUrlは
        { 
            取得
            { 
                リターンm_proxyUrlを。
            } 
            集合
            {
                この .m_proxyUrl = 値; 
            } 
        } 
    } 
}

主な機能は、テストコードを呼び出します。

使用したシステムを、
 使用System.Collections.Genericを、
 使用してSystem.Linqのを、
 使用System.Textのを、

使用System.IOを、
 使用System.Xml.Serializationと、

名前空間DeserializeTest 
{ 
    クラスプログラム
    { 
        静的 ボイドメイン(文字列[]引数)
        { 
            // テスト1:テスト・ベース・クラスのインスタンスにデシリアライズxmlファイル。テスト。限りに同じ名前の非直列化されたクラスを使用して、ルートノードXMLファイルの名前として
            文字列 fileNameBase = @「D:\ MyProjectと\ DeserializeTest \ DeserializeTest \ binに\デバッグ\ GobalConfig \ SettingsBase.xml ; 
            SettingsBase SettingsBase。
            XmlSerializerをSerBase = 新しい新規のXmlSerializer(typeof演算(SettingsBase));
             使用(たTextReader trBase = 新しい新規のStreamReader(fileNameBase))
            { 
                SettingsBase = (SettingsBase)serBase.Deserialize(trBase); 
                settingsBase.FileName = fileNameBase; 
            } 

            // テスト2:テストxmlファイルは、サブクラスをデシリアライズします。テスト。限り、同じ名前の非直列化されたクラスを使用してXMLファイルのルート名としてすることができます。もちろん、デシリアライゼーション派生クラス後のクラスのインスタンスに対するベース点の例を参照して問題ではありません。
            文字列 fileNameに= @ " D:\ MyProjectと\ DeserializeTest \ DeserializeTest \ binに\デバッグ\ GobalConfig \ WorldWind.xml "  
            SettingsBase設定; //現在はWorldWindSettings設定として、ここで定義されていない、何の問題の 
            種類のタイプ= typeof演算(WorldWindSettings); // ルート名xmlファイルのみWorldWindSettingsのために、ここで、WorldWindSettingsあるので、しかし、ことはできませんSettingsBase 
            のSerのXmlSerializer = 新しい新しいXmlSerializerを(タイプ)、
             使用(TR =たTextReader 新しい新規のStreamReader(filename)で)
            { 
                // 設定=(WorldWindSettings)ser.Deserialize(TR); // 2によって、このコード!
                =設定(SettingsBase)ser.Deserialize(TR); 
                settings.FileName = ファイル名; 
            }

            System.Console.WriteLine(" こんにちは" ); 
        } 
    } 
}

基本クラスのXMLファイル:

<?XMLバージョン= " 1.0 "コード= " UTF-8 "?> 
<SettingsBase> 
  <ファイル名> WorldWind.xml </ファイル名> 
</ SettingsBase>

派生クラスのXMLファイル:

<?XMLバージョン= " 1.0 "コード= " UTF-8 "?> 
<WorldWindSettings> 
  <ファイル名> WorldWind.xml </ファイル名> 
  <ProxyUrl> www.baidu.com </ ProxyUrl> 
</ WorldWindSettings>

 ダウンロードソース:DeserializeTest.rarの     抽出コード:pkya 

要約:限り、同じ名前のデシリアライズクラスでルートノードのXMLファイルの名前とすることができるように、クラスのインスタンスとして非直列化XMLファイル。もちろん、デシリアライゼーションの派生クラス後のインスタンスを指すように、基本クラスのインスタンスを参照して、直列化復元の成功、後に問題はありません。

その他の考慮事項:

1は、クラスの静的メンバ変数がある場合は、クラスがインスタンス化されたコンストラクタを呼び出す前に、最初の静的メンバ変数をインスタンス化します。

おすすめ

転載: www.cnblogs.com/rainbow70626/p/11839330.html