无法使用XML序列化程序反序列化多个对象,得到InvalidOperationException

本文关键字:对象 InvalidOperationException 得到 反序列化 程序 XML 序列化 | 更新日期: 2023-09-27 18:29:07

我有一个简单的类Cust,我想使用XML序列化来序列化它。

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未处理-XML文档(5,10)中出现错误

我知道如果我把多个对象放在一个集合中,我可以存储它们。

但在这种情况下,我将无法将列表附加到xml文件中。我想单独序列化多个对象,并逐个序列化;那么我想反序列化它们。

无法使用XML序列化程序反序列化多个对象,得到InvalidOperationException

使用对象数组

//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();

诀窍是(以某种方式)将每个XML彼此分离。

  1. 使用XmlWriter将对象序列化到文件(紧凑格式,无制表符/新行)
  2. 将新行附加到文件(在序列化消息之后)
  3. 对所有对象重复此操作
  4. 使用StreamReader.ReadLine逐行读取文件,每行代表一个完整的XML文档
  5. 为刚读取的每一行创建一个内存流,并从中反序列化对象