C# XML反序列化,加载已保存字符的实例
在Windows窗体中,玩家的目标是将字符存储在XML中,然后加载存储的字符 错误: System.InvalidOperationException:“XML文档(2,2)中存在错误。” InvalidOperationException: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
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; }
}
}