-1

我试过这样的代码.....

//序列化

private void Serialize_Click(object sender, EventArgs e)
        {
            List<Personal> pdetails = new List<Personal>();
            Personal personals = new Personal
            {
                ID = int.Parse(txtsno.Text),
                Name = txtname.Text,
                Phone = long.Parse(txtpno.Text),
                Address = txtaddr.Text
            };
            pdetails.Add(personals);

 XmlSerializer xmlser = new XmlSerializer(typeof(List<Personal>));
            StreamWriter swtr = new StreamWriter(@"f:\serialize.xml");
            xmlser.Serialize(swtr, pdetails);
            swtr.Close();
 }

//反序列化

private void button3_Click(object sender, EventArgs e)
        {
            XmlSerializer xmlser = new XmlSerializer(typeof(List<Personal>));
            StreamReader srdr = new StreamReader(@"f:\serialize.xml");
            List<Personal>p = (List<Personal>)xmlser.Deserialize(srdr);
            srdr.Close();
        }

但我想要动态 xml 序列化和反序列化...

即,当我序列化要添加到 xml 文档中的对象时.. 两个或更多输入数据....

但我也输入了创建 xml 文件的详细信息……但我的探针无法将另一个输入数据输入到现有文件本身……

为此,我想使用内存流..如何使用内存流通过单击按钮在 xml 中写入更多输入..

如何反序列化以获取 xml 到对象...

4

2 回答 2

1

您必须有一个基类来呈现您的数据,并且是一个示例:

  [XmlIncludeAttribute(typeof(ConcreteFooOne))]
  [XmlIncludeAttribute(typeof(ConcreteFooTwo))]
  [XmlIncludeAttribute(typeof(ConcreteFooThree))]
  [XmlRoot(ElementName = "FooData", Namespace = "http://foo.bar")]  
  public abstract partial class AbstractFoo
  {

  }

  [XmlRoot(ElementName = "FooData", Namespace = "http://foo.bar")]

  public class ConcreteFooOne : AbstractFoo
  {
    public string MyProp { get; set; }
  }
  [XmlRoot(ElementName = "FooData", Namespace = "http://foo.bar")]

  public class ConcreteFooTwo : AbstractFoo
  {

  }
  [XmlRoot(ElementName = "FooData", Namespace = "http://foo.bar")]

  public class ConcreteFooThree : AbstractFoo
  {

}


class Program
  {
    static void Main()
    {          

      XmlSerializer xs = new XmlSerializer(typeof(List<AbstractFoo>));
      TextWriter writer = new StreamWriter("test.txt", false);
      var list = new List<AbstractFoo>();
      list.Add(new ConcreteFooOne() { MyProp = "test" });
      list.Add(new ConcreteFooTwo() );
      list.Add(new ConcreteFooThree());
      xs.Serialize(writer, list);

      writer.Close();

      StreamReader srdr = new StreamReader("test.txt");
      var lst = (List<AbstractFoo>)xs.Deserialize(srdr);
      srdr.Close();          
    }
  }
于 2013-07-23T13:47:30.227 回答
1

我认为您的问题不在于序列化本身,而在于同步。

我可以看到几个可能的解决方案:

  1. 关闭时的序列化和打开应用程序时的反序列化。您可以将带有序列化的部分移动到您的表单的 OnClose 事件,并将反序列化的部分移动到构造函数。这样,在序列化过程正在进行时添加的附加数据没有问题

  2. 过程同步。您可以在序列化仍未完成时阻止添加新数据。之后,您可以取消阻止。另一种解决方案可能是拥有pdetails. 这样你就可以序列化副本。序列化将复制pdetailspdetails_copy并序列化pdetails_copy并检查pdetails. 如果是这样,它将再次进行序列化。

于 2013-07-23T13:51:19.087 回答