1

XMLシリアライゼーションを使用してシリアライズしたい単純なクラスCustがあります。

public class Cust

{
public string CustName;
public int ID;
public Cust() { }
public Cust(string nm, int id)
{
CustName = nm;
ID = id;
}
public string DisInfo()
{
return CustName+" "+ID;
}

}

私のシリアル化機能は次のとおりです。

private void button1_Click(object sender, EventArgs e)

{
//Serialize
FileStream fs = new FileStream(@"C:\tmp\cust.xml", FileMode.Create);
XmlSerializer xs = new XmlSerializer(typeof(Cust));
Cust c1 = new Cust("Rahul S",111);
Cust c2 = new Cust("John D", 222);

xs.Serialize(fs, c1);
xs.Serialize(fs, c2);
fs.Close();
}

出力は cust.xml です

<?xml version="1.0"?>
<Cust xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <CustName>Rahul S</CustName>
  <ID>111</ID>
</Cust><?xml version="1.0"?>
<Cust xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <CustName>John D</CustName>
  <ID>222</ID>
</Cust>

次に、逆シリアル化を試みました。xml ファイルから Cust オブジェクトを取得する

private void button2_Click(object sender, EventArgs e)

{

//Deserialize

FileStream fs = new FileStream(@"C:\tmp\cust.xml", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
XmlSerializer xs = new XmlSerializer(typeof(Cust));

Cust c1 = (Cust)xs.Deserialize(fs);//Exception
Cust c2 = (Cust)xs.Deserialize(fs);

fs.Close();

}

これは例外をスローします

InvalidOperationException Unhandled- XML ドキュメントのエラー (5,10)

複数のオブジェクトをコレクションに入れると、複数のオブジェクトを格納できることがわかりました。

しかし、その場合、xmlファイルにリストを追加することはできません。複数のオブジェクトを個別に、または 1 つずつシリアル化したい。次に、それらを逆シリアル化します。

4

2 に答える 2

0

オブジェクトの配列を使用する

//Serialize
FileStream fs = new FileStream(@"C:\tmp\cust.xml", FileMode.Create);
XmlSerializer xs = new XmlSerializer(typeof(Cust[]));
Cust c1 = new Cust("Rahul S",111);
Cust c2 = new Cust("John D", 222);

xs.Serialize(fs, new[]{c1,c2});
fs.Close();

//Deserialize

FileStream fs = new FileStream(@"C:\tmp\cust.xml", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
XmlSerializer xs = new XmlSerializer(typeof(Cust[]));

Cust[] c1 = (Cust[])xs.Deserialize(fs);//Exception

fs.Close();
于 2013-08-27T13:05:53.087 に答える
0

秘訣は、(何らかの方法で) 各 XML を他の XML から分離することです。

  1. XmlWriterオブジェクトをファイルにシリアル化するために使用します (コンパクトな形式、タブ/改行なし)
  2. ファイルに新しい行を追加します (シリアル化されたメッセージの後)
  3. すべてのオブジェクトに対して繰り返します
  4. StreamReader.ReadLineファイルを 1 行ずつ読み取るために使用します。各行は完全な XML ドキュメントを表します。
  5. 読み取った各行のメモリ ストリームを作成し、そこからオブジェクトを逆シリアル化します。
于 2021-02-04T14:34:28.977 に答える