5

C# を使用して...クラスからオブジェクトを作成し、それらをオブジェクト コレクションに追加する小さなアプリがあり、途中でいくつかの UI を実行して、コレクション内で現在選択されているオブジェクトから特定の値を表示します (WPF UI を使用) . そのため、ユーザーが自分のオブジェクト コレクションをファイルに保存できるようにする機能を追加して、次にアプリを実行したときにそれを読み込めるようにしたいと考えています。

XML は当然の方法だと思いますが、その方法については何も知りません。では、オブジェクトのコレクションを xml ファイルにエクスポートまたはダンプするにはどうすればよいでしょうか。さらに重要なこととして、その XML ファイルをアプリに読み込んでコレクションを再作成するにはどうすればよいでしょうか。

アプリのスクリーンショットはこちら

4

4 に答える 4

4

XML を選択する場合は、 System.Runtime.Serializationが役に立ちます。

私のテスト アプリの 1 つでは、オブジェクトを XML としてシリアライズして、すべてをオフラインで確認できるようにする必要がある場合があります。これが私が使用するスニペットです(決して最適化されておらず、ある日すぐにまとめただけで、必要に応じて機能しました)。

public static string ObjectToXml<T>(T objectToSerialise)
{
    StringWriter Output = new StringWriter(new StringBuilder());
    XmlSerializer xs = new XmlSerializer(objectToSerialise.GetType());
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("MyNs", "http://www.someXmlNamespace/namespace1"); // add as many or few as you need
    xs.Serialize(Output, objectToSerialise, ns);
    return Output.ToString();
}

その後、データをファイルに吐き出すのは簡単です。

:
XML コンテンツを文字列として取得できるようにする必要があったため、いくつかの方法のいずれかで永続化することができました。それが必要な場合は、ディスクに直接アクセスする方法を構築することも簡単です。
これは私にとってはうまくいきますが、自分のニーズに合わせて微調整する必要があるかもしれません.

于 2009-02-20T16:47:17.047 に答える
2

XMLシリアル化は問題なく、多くの状況に適していますが、XML固有のオーバーヘッドのため、出力は少しかさばります。ファイルの内容が人間が読める形式である必要がないこの状況では、これにより他のオプションが開きます。

JSONシリアル化は、ファイルサイズを抑えるのに役立ちます。JavaScriptSerializerは、System.Web.Script.Serialization(System.Web.Extensions.dll)にあります。

以下の例では、ConfigurationItemの型付きジェネリックリストがあります。構成アイテムは他のクラスと同様ですが、シリアル化するにはプロパティをパブリックにする必要があります。

var strFileData = System.IO.File.ReadAllText("FileName.data");
var jss = new JavaScriptSerializer();
var objItemsList = jss.Deserialize<List<ConfigurationItem>>(strFileData);
// {insert code here tomanipulate object "objItemsList"}
var strNewData = jss.Serialize(objItemsList);
System.IO.File.WriteAllText("FileName.data", strNewData);
于 2009-02-23T23:44:16.240 に答える
1

XML へのシリアル化の問題は、シリアル化されるクラスが変更された場合 (新しいプロパティ)、xml を使用してそのクラスのインスタンスを再作成できないことです。

クラスがかなり単純な場合 (またはそうでない場合でも)、手動で行うことができます。

XmlDocument doc = new XmlDocument();
XmlNode root = doc.CreateNode(XmlNodeType.Element,"root")
doc.AppendChild(root)
XmlNode newPage = doc.CreateNode(XmlNodeType.Element,"pattern")
root.AppendChild(newPage)
newPage.Attributes.Append(doc.CreateAttribute("Name",pattern.Name)
foreach (Hole h in pattern.Holes)
{
  XmlNode hole = doc.CreateNode(XmlNodeType.Element,"hole")
  hole.Attributes.Append(doc.CreateAttribute("XCoord",h.Xcoord)
  hole.Attributes.Append(doc.CreateAttribute("YCoord",h.Ycoord)
  newPage.AppendChild(hole)
}
// etc
doc.Save("output.xml")

このコードはラフですが、次のようなコードが生成されます。

<root>
  <pattern name="Pattern1">
    <hole XCoord="100" YCoord="50" />
  </pattern>
</root>
于 2009-02-25T22:58:27.707 に答える
0

いくつかの隠された落とし穴に関するいくつかの優れた投稿を含む、XMLシリアル化に関するStackOverflowに関するトピックがたくさんあります。

シリアル化を使用したデータ構造の保存

シリアル化Gotchyas

于 2009-02-20T16:52:48.873 に答える