2011-05-08 112 views
1

我必须先反序列化XML文件名单,然后扩大这个名单,并与更多的(需要对这个倍数)加1对象从XML问题从XML文件序列化/反序列化对象/

代码序列化所有:从的.cs

<?xml version="1.0"?> 
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
      <name>Danie</name> 
      <lastName>McJackie</lastName> 
      <age>27</age> 
</Person> 

代码文件:我评论在那里我得到错误和复制错误消息

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Xml; 
using System.IO; 
using System.Xml.Serialization; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
    private List<Person> Deserialize(string path) 
    { 
     using (FileStream fs = new FileStream(path, FileMode.Open)) 
     { 
      XmlSerializer ser = new XmlSerializer(typeof(List<Person>)); 
      return (List<Person>)ser.Deserialize(fs); 
      //There is an error in XML document (2, 2). 
      // I got this error and don't know how to manage with it. 
     } 
    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     string path = Server.MapPath(Request.ApplicationPath + "/test.xml"); 
     List<Person> people = File.Exists(path) ? Deserialize(path) :new List<Person>(); 
     people.Add(new Person(TextBox1.Text, TextBox2.Text, int.Parse(TextBox3.Text))); 
     using (FileStream fs = File.OpenWrite(path)) 
     { 
      XmlSerializer ser = new XmlSerializer(typeof(List<Person>)); 
      ser.Serialize(fs, people); 
     } 


    } 
} 

和至少类连载:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 



[Serializable] 
public class Person 
{ 

    public string name; 
    public string lastName; 
    public int age; 
    public Person(string _name, string _lastName, int _age) 
    { 
     name = _name; 
     lastName = _lastName; 
     age = _age; 
    } 
    public Person() 
    { 

    } 
} 

异常详细信息:

System.InvalidOperationException was unhandled by user code 
Message=There is an error in XML document (2, 2). 
Source=System.Xml 
StackTrace: 
     at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader,            String encodingStyle, XmlDeserializationEvents events) 
    at System.Xml.Serialization.XmlSerializer.Deserialize(Stream stream) 
    at _Default.Deserialize(String path) in e:\Programy c#\WebSites\ASP8\Default.aspx.cs:line 22 
    at _Default.Button1_Click(Object sender, EventArgs e) in e:\Programy c#\WebSites\ASP8\Default.aspx.cs:line 29 
    at System.Web.UI.WebControls.Button.OnClick(EventArgs e) 
    at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) 
    at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) 
    at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) 
     at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)     
     at System.Web.UI.Page.ProcessRequestMain(Boolean                includeStagesBeforeAsyncPoint,  Boolean includeStagesAfterAsyncPoint) 
    InnerException: System.InvalidOperationException 
     Message=<Person xmlns=''> was not expected. 
    Source=_1r-cm1p 
    StackTrace: 
     at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderList1.Read3_ArrayOfPerson() 
    InnerException: 

这是我添加了最后一次编辑

反序列化文件的.cs:

string path = Server.MapPath(Request.ApplicationPath + "/test.xml"); 
    using (FileStream fs = new FileStream(path, FileMode.Open)) 
    { 
     XmlSerializer ser = new XmlSerializer(typeof(List<Person>)); 
     List<Person> os = (List<Person>)ser.Deserialize(fs); 
     foreach (var i in os) 
     { 
      Label1.Text += i.Name + "<hr />" + i.LastName + "<hr />" + i.Age.ToString() + "<hr />"; 
     } 

     fs.Close(); 

一切工作很好,谢谢大家的帮助: )

+0

什么错误?异常详情? – Oded 2011-05-08 19:53:43

+1

只是一个帮手 - 轻轻改变你的命名约定_name应该是你的私有成员,并且你的公共字符串名应该是公共字符串Name(note大写) – 2011-05-08 19:54:25

+1

2,2的错误几乎总是意味着在文件开始处的回车 - 这是怎么回事? – 2011-05-08 19:57:13

回答

3

而不是

XmlSerializer ser = new XmlSerializer(typeof(List<Person>)); 

尝试

XmlSerializer ser = new XmlSerializer(typeof(Person)); 
+0

当我改变我得到错误: 无法转换'Person'类型的对象来键入'System.Collections.Generic.List'1 [Person]'。 – harry180 2011-05-08 20:30:17

+0

但它现在正在工作。只需调整你的代码,因为它返回一个Person。 – ariel 2011-05-08 20:32:23

+0

对不起,我看到你在序列化Person列表,所以你的XML应该有多个人,对吧? – ariel 2011-05-08 20:35:33

0

有没有在您的命名空间符行结束?

<?xml version="1.0"?> 
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http:// 
www.w3.org/2001/XMLSchema"> 

应该

<?xml version="1.0"?> 
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

当从问题复制,线路末端似乎有

+0

你是什么意思?但我不明白 – harry180 2011-05-08 20:46:31

+1

我希望你能看到两个片段的区别吗? – sehe 2011-05-08 21:28:39

+0

不,我没有看到不同的一切对我来说是一样:( – harry180 2011-05-09 08:44:44