【问题标题】:Deserialize XML file反序列化 XML 文件
【发布时间】:2012-08-24 20:59:27
【问题描述】:

我有一个包含 4 个不同字符串的 XML 文件,但我无法反序列化该文件。有人可以帮我解决这个问题吗?

我在网上寻找答案,但没有一个有效,我不知道该怎么办。

这是我要反序列化的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<saveData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<strFolder1>1st Location</strFolder1>
<strFolder2>2nd Location</strFolder2>
<strTabName>newTab0</strTabName>
<strTabText>Main</strTabText>
</saveData>

【问题讨论】:

  • XML 看起来像...并且您想将它反序列化为一个看起来像...的类的对象?
  • 什么不起作用?您现在要求人们重复您已经知道的答案。
  • 您说您在“反序列化文件”时遇到问题。您收到错误消息还是有代码块要查看?
  • 我以前从未使用过 xml 文件,我不知道从哪里开始
  • 我可以创建文件,但我不知道如何反序列化它

标签: c# xml serialization xml-serialization deserialization


【解决方案1】:
var ser = new XmlSerializer(typeof(saveData));
var obj = (saveData)ser.Deserialize(stream);

public class saveData
{
    public string strFolder1;
    public string strFolder2;
    public string strTabName;
    public string strTabText;
}

【讨论】:

    【解决方案2】:

    我建议查看XmlReader。其他一些方法以不同的方式更容易,但是您可以从 XmlReader 构建任何东西。如:

    while(rdr.Read())
      if(rdr.NodeType == XmlNodeType.Element)
        switch(rdr.LocalName)
        {
          case "strFolder1":
            strFolder1 = rdr.ReadContentAsString();
            break;
          case "strFolder2":
            strFolder2 = rdr.ReadContentAsString();
            break;
          case "strTabName":
            strTabName = rdr.ReadContentAsString();
            break;
          case "strTabText":
            strTabText = rdr.ReadContentAsString();
            break;
        }
    

    (如果保证订购,我们可以走一些捷径,我这样做是为了表明艰难的方式并不难)。

    在很多情况下,使用 XmlDocument、XmlSerializer 和 XDocument 更容易,但我建议先学习这一点,因为它可以处理所有事情,而且效率永远不会降低。如果你先学习它,那么更糟糕的是你做了比必要的工作更多的工作,最终得到比严格必要的更有效的东西(你会因为对更简单方法的无知而进行微优化)。如果你先了解其他人,那么更糟糕的是,你做的工作比必要的多得多,最终会得到比需要的效率低得多的东西。

    【讨论】:

    • 谢谢,我确实喜欢以更难的方式学习东西,因为就像你说的那样,它通常更有效率,而且通常能让你更好地掌握你实际在做什么。
    • 是的。我想说,我对知识的渴望意味着学习更高层次的方法永远不会阻止我在需要的时候学习更低层次的方法,但如果我这样做了,我就是一个彻头彻尾的骗子!当然,也要学习其他方法。
    【解决方案3】:
    namespace Cars1
    {
    
        public class saveData
        {
            public string strFolder1;
    
            public string strFolder2;
    
            public string strTabName;
    
            public string strTabText;
    
        }
    
    
        [Serializable]
        class Program
        {
            static void Main(string[] args)
            {
                saveData obj = new saveData();
    
                FileStream fopen = new FileStream("abc.xml", FileMode.Open);
                XmlSerializer x = new XmlSerializer(obj.GetType());
                StreamReader read_from_xml = new StreamReader(fopen);
                obj = (saveData)x.Deserialize(read_from_xml);
    
                Console.WriteLine(obj.strFolder1 + "=>" + obj.strFolder2 + "=>" + obj.strTabName+"=>"+obj.strTabText);
                Console.ReadKey();
    
                fopen.Close();
    
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 2019-09-24
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多