1

以下に示すように、いくつかのクラスからXMLファイルを簡単に生成することができました。

public class AllConfig : XMLEncapsulator
{
    [XmlElement("Database-Settings")]
    public DataBaseConfiguration databaseConfiguration { get; set; }
    [XmlElement("Merlin-Settings")]
    public MerlinConfiguration merlinConfiguration { get; set; }
}



public class DataBaseConfiguration : XMLEncapsulator
{
    public string dbIP { get; set; }
    public int ?port { get; set; }
    public string username { get; set; }
    public string password { get; set; }
}

public class MerlinConfiguration : XMLEncapsulator
{
    public string MerlinIP { get; set; }
    public int ?MerlinPort { get; set; }
    public int ?RecievingPort { get; set; }
}


// load classes with information, then;

  try
        {
            allConfig.databaseConfiguration = dbConfig;
            allConfig.merlinConfiguration = merlinConfig;
            allConfig.Save();
        }
        catch (Exception ErrorFinalisingSave)
        {
            MessageBox.Show(ErrorFinalisingSave.Message + "3");
        }

これは完璧に機能し、私に次のようになります。

<AllConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <databaseConfiguration>
 <dbIP></dbIP>
 <port></port>
 <username></username>
 <password></password>
</databaseConfiguration>
<merlinConfiguration>
 <MerlinIP></MerlinIP>
 <MerlinPort></MerlinPort>
 <RecievingPort></RecievingPort>
 </merlinConfiguration>
</AllConfig>

ただし、これをフォームに戻すにはどうすればよいですか?だから私はこのようなものを持っていますが、それを機能させることができないようです。

  AllConfig allConfig;
    DataBaseConfiguration dbConfig;
    MerlinConfiguration merlinConfig;

  //need to load here.

//check if values loaded are null, and then load them if they exist into textboxes and such.

2つの構成クラスをロードしてから、それらを全体的な構成クラスに割り当てる必要がありますか?または、クラス全体をロードして、サブ構成クラスをこれから割り当てる必要がありますか?

 allConfig = new AllConfig();

                dbConfig = new DataBaseConfiguration();
                merlinConfig = new MerlinConfiguration();

                allConfig.databaseConfiguration = dbConfig;
                allConfig.merlinConfiguration = merlinConfig;

                allConfig.databaseConfiguration.Load();
                allConfig.merlinConfiguration.Load();

編集:ここに私の読み込み方法があります。

 public virtual void Load()
{
    if (File.Exists(DeviceManager.path))
    {
        StreamReader sr = new StreamReader(DeviceManager.path);
        XmlTextReader xr = new XmlTextReader(sr);
        XmlSerializer xs = new XmlSerializer(this.GetType());
        object c;
        if (xs.CanDeserialize(xr))
        {
            c = xs.Deserialize(xr);
            Type t = this.GetType();
            PropertyInfo[] properties = t.GetProperties();
            foreach (PropertyInfo p in properties)
            {
                p.SetValue(this, p.GetValue(c, null), null);
            }
        }
        xr.Close();
        sr.Close();
    }
}
4

4 に答える 4

1

でクラスを保存し、allConfig.Save();でロードしてみます

allConfig.databaseConfiguration.Load();
allConfig.merlinConfiguration.Load();

XmlSerializer正しく使用されていないようです。だからこれを試してみてください:

public class Person
{
  public string Name;
  public int Age;
}

p.Name = "Stacey"; p.Age = 30;

//serialize
XmlSerializer xs = new XmlSerializer (typeof (Person));

using (Stream s = File.Create ("person.xml"))
  xs.Serialize (s, p);

//deserialize
Person p2;
using (Stream s = File.OpenRead ("person.xml"))
  p2 = (Person) xs.Deserialize (s);

Console.WriteLine (p2.Name + " " + p2.Age);   // Stacey 30

一言で言えばC#

更新:ここで私はあなたのコードに例を採用します。XmlEncapsulatorを削除するのは、実際には必要のないSaveメソッドとLoadメソッドを実装していると思うからです。本当に必要な場合は返品できます。何かが変わるかもしれないとは思わないでください。だから、ここにコード:

         AllConfig all = new AllConfig();
         all.databaseConfiguration = new DataBaseConfiguration();
         all.databaseConfiguration.dbIP = "123";
         all.databaseConfiguration.password = "asd";
         all.databaseConfiguration.port = 123;
         all.databaseConfiguration.username = "sad";
         all.merlinConfiguration = new MerlinConfiguration();
         all.merlinConfiguration.MerlinIP = "123";
         all.merlinConfiguration.MerlinPort = 123;
         all.merlinConfiguration.RecievingPort = 123;

        //serialize 
        XmlSerializer xs = new XmlSerializer(typeof(AllConfig));
        using (Stream s = File.Create ("config.xml"))
            xs.Serialize (s, all); 
        //deserialize 
        AllConfig all2;  
        using (Stream s = File.OpenRead ("config.xml"))
            all2 = (AllConfig)xs.Deserialize(s);
        Console.WriteLine(all2.ToString());
于 2012-06-28T13:31:24.370 に答える
1

これは、Xmlからオブジェクトを逆シリアル化するために使用される一般的なメソッドです。これは役に立ちますか?

public static T Deserialize<T>(string xml) where T : class, new()
{
    if (string.IsNullOrEmpty(xml))
    {
        throw new ArgumentNullException("xml");
    }

    return (T)Deserialize(new MemoryStream(Encoding.UTF8.GetBytes(xml)));
}

public static T Deserialize<T>(Stream xmlStream) where T : class, new()
{
    if (xmlStream == null)
    {
        throw new ArgumentNullException("xmlStream");
    }

    return (T)xmlSerializer.Deserialize(xmlStream);
}
于 2012-06-28T13:23:13.670 に答える
1

これが、データ型を使用して実装する方法です。他の人が言っているように、私はXMLEncapsulatorあなたがあなたのデータ型を導き出しているものを単に削除します。また、結果のxmlでは、XmlElement指定した属性が尊重されていることに注意してください。

public void Test()
{
   var dbConfig = new DataBaseConfiguration();
   dbConfig.dbIP = "127.0.0.1";
   dbConfig.port = 12345;
   dbConfig.username = "harlam357";
   dbConfig.password = "password";
   var merlinConfig = new MerlinConfiguration();
   merlinConfig.MerlinIP = "192.168.0.1";
   merlinConfig.MerlinPort = 8080;
   merlinConfig.RecievingPort = 8081;
   var config = new AllConfig { databaseConfiguration = dbConfig, merlinConfiguration = merlinConfig };

   string xml = Serialize(config);
   var config2 = Deserialize<AllConfig>(xml);

   Debug.Assert(config2.databaseConfiguration.dbIP == "127.0.0.1");
   Debug.Assert(config2.databaseConfiguration.port == 12345);
   Debug.Assert(config2.databaseConfiguration.username == "harlam357");
   Debug.Assert(config2.databaseConfiguration.password == "password");
   Debug.Assert(config2.merlinConfiguration.MerlinIP == "192.168.0.1");
   Debug.Assert(config2.merlinConfiguration.MerlinPort == 8080);
   Debug.Assert(config2.merlinConfiguration.RecievingPort == 8081);
}

public static string Serialize<T>(T value) where T : class
{
   if (value == null) return null; // throw or whatever fits your use case

   var xmlSerializer = new XmlSerializer(typeof(T));
   using (var stream = new MemoryStream())
   {
      xmlSerializer.Serialize(stream, value);
      return Encoding.UTF8.GetString(stream.GetBuffer());
   }
}

public static T Deserialize<T>(string xml) where T : class
{
   if (xml == null) return null; // throw or whatever fits your use case

   var xmlSerializer = new XmlSerializer(typeof(T));
   using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)))
   {
      return (T)xmlSerializer.Deserialize(stream);
   }
}

結果のXML

<?xml version="1.0"?>
<AllConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Database-Settings>
    <dbIP>127.0.0.1</dbIP>
    <port>12345</port>
    <username>harlam357</username>
    <password>password</password>
  </Database-Settings>
  <Merlin-Settings>
    <MerlinIP>192.168.0.1</MerlinIP>
    <MerlinPort>8080</MerlinPort>
    <RecievingPort>8081</RecievingPort>
  </Merlin-Settings>
</AllConfig>
于 2012-06-28T14:15:36.950 に答える
0

私自身の問題を修正しました。それは私がそれをロードしていた方法でした、結局私はそのようにそれをすることになりました。

allConfig = new AllConfig();
                dbConfig = new DataBaseConfiguration();
                merlinConfig = new MerlinConfiguration();
                allConfig.databaseConfiguration = dbConfig;
                allConfig.merlinConfiguration = merlinConfig;
                allConfig.Load();

そこで、シリアル化するクラスのインスタンスを作成してから、offで構成されるクラスを作成し、これらをメインクラスに割り当てました。次に、メインクラスをロードしました(シリアライザーを介して、それが構成するクラスにデータを入力すると想定し、そのようにアクセスしました。

allConfig.databaseConfiguration.port;
allConfig.databaseConfiguration.username;

等々。アドバイスをありがとう、みんな本当に助けてくれました。

于 2012-06-28T14:09:36.117 に答える