Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XML反序列化,加载已保存字符的实例_C#_Xml_Winforms_Serialization - Fatal编程技术网

C# XML反序列化,加载已保存字符的实例

C# XML反序列化,加载已保存字符的实例,c#,xml,winforms,serialization,C#,Xml,Winforms,Serialization,在Windows窗体中,玩家的目标是将字符存储在XML中,然后加载存储的字符 错误: System.InvalidOperationException:“XML文档(2,2)中存在错误。” InvalidOperationException:不应出现 public static PlayerBase LoadGame() { if (!File.Exists(PlayerSettingsFile)) { re

在Windows窗体中,玩家的目标是将字符存储在XML中,然后加载存储的字符

错误: System.InvalidOperationException:“XML文档(2,2)中存在错误。” InvalidOperationException:不应出现

        public static PlayerBase LoadGame()
        {
        if (!File.Exists(PlayerSettingsFile))
        {
            return new PlayerBase();
        }

        using (Stream stream = File.OpenRead(PlayerSettingsFile))
        {
            XmlSerializer ser = new XmlSerializer(typeof(PlayerBase));
            return (PlayerBase)ser.Deserialize(stream);
        }

    }
我认为问题在于玩家存储了PlayerBase的派生类,在本例中是狂暴者。那么,当加载时,它正在寻找PlayerBase的关键字,并找到了狂暴者

如果是这样的话。有没有一种简化代码的方法来检查玩家为自己的英雄创建了哪个类

这是创作部分

 private void Btn_SaveChar_Click(object sender, EventArgs e)
    {
        string name = Txt_CharName.Text;
        string selectedClass = Cbo_CharClass.Text;

        EntityGender gender = Rdo_GenderMale.Checked ? EntityGender.Male: EntityGender.Female;

        if (!String.IsNullOrWhiteSpace(name) && !String.IsNullOrWhiteSpace(selectedClass))
        {
            PlayerBase hero = new PlayerBase();
            if (selectedClass == "Berserker")
            {
                hero = new Berserker(name, gender);
                FileManager.StoreCharacter(hero);
            }
XML文件,


弗莱德
10
5.
5.
25
男性
狂暴者

尝试以下反序列化程序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    public class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        public static void Main()
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(Berserker));
            Berserker berserker = (Berserker)serializer.Deserialize(reader);

        }
    }
    public class Berserker
    {
         public string Name { get; set;}
         public int Strength { get; set;}
         public int Dexterity { get; set;}
         public int Wisdom { get; set;}
         public int Health { get; set;}
         public string Gender { get; set;}
         public string CharacterClass { get; set; }
    }
}

我们需要查看xml。这是一个常见错误,但可能由于某些原因而发生。在底部添加了XML。您可以使用[
XmlSerializeCxml.DeserializePolymorphicXml(此TextReader TextReader,params Type[]types)
]从
PlayerBase
的所有可能的派生类型传入。在内部,它调用每种可能的类型。太好了!它很管用,谢谢!是的,更改为检查狂暴者的类型使其工作!这就是我的假设。现在我需要检查玩家创建了哪个类,以便加载正确的类?我认为PlayerBase可以使用,因为它们都是从这个基础上派生出来的。我如何检查玩家为typeof选择了哪个类?如果(typeof(Berserker)==Berserker.GetType())
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    public class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        public static void Main()
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(Berserker));
            Berserker berserker = (Berserker)serializer.Deserialize(reader);

        }
    }
    public class Berserker
    {
         public string Name { get; set;}
         public int Strength { get; set;}
         public int Dexterity { get; set;}
         public int Wisdom { get; set;}
         public int Health { get; set;}
         public string Gender { get; set;}
         public string CharacterClass { get; set; }
    }
}