gpt4 book ai didi

c# - 如何调试 XML 反序列化?

转载 作者:数据小太阳 更新时间:2023-10-29 02:12:14 31 4
gpt4 key购买 nike

我想知道您是否有关于如何调试以下 XML 反序列化的任何提示?我无法让它工作。反序列化器基本上创建了 summon 和 slash 实例,但它们的所有属性都是空的。相关类如下所示。


带有反序列化器的 SkillCollection 类:

[DataContract(Name = "Skills", Namespace = "")]
public class SkillCollection
{

[DataMember(Name = "Slash")]
public Skill Slash { get; set; }

[DataMember(Name = "Summon")]
public Skill Summon { get; set; }

public static object Deser(string path, Type toType)
{
var s = new DataContractSerializer(toType);
using (FileStream fs = File.Open(path, FileMode.Open))
{
object s2 = s.ReadObject(fs);
if (s2 == null)
Console.WriteLine(@" Deserialized object is null");
else
Console.WriteLine(@" Deserialized type: {0}", s2.GetType());
return s2;
}
}

它是通过属性技能从另一个类调用的:

Skills = (SkillCollection)SkillCollection.Deser(
Path.Combine(path, "Skills.xml"),
typeof(SkillCollection));

技能等级:

public class Skill
{
//Cast: time it takes to cast it
[DataMember(Name = "Cast")]
public float Cast { get; set; }

//ReCast: cooldown period before player can cast it again
[DataMember(Name = "ReCast")]
public float ReCast { get; set; }

[DataMember(Name = "MPCost")]
public int MpCost { get; set; }

public Timer Timer { get; private set; }
public bool Ready { get; set; }

public Skill()
{
Ready = true;

Timer = new Timer { Interval = ReCast + 500, AutoReset = false };
Timer.Elapsed += OnTimedEvent;
}

//Runs when recast is up
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
Ready = true;
}
}

XML 文件:

<Skills>
<Slash>
<Cast>0.00</Cast>
<ReCast>60.00</ReCast>
<MPCost>0</MPCost>
</Slash>
<Summon>
<Cast>5.98</Cast>
<ReCast>2.49</ReCast>
<MPCost>0</MPCost>
</Summon>
</Skills>

为了避免混淆,我的目标是运行反序列化器,然后让 SkillCollection 类包含 Skill 的两个实例(Slash 和 Summon),并能够通过它们的属性分别访问它们。

感谢您提供有关调试此问题的任何帮助/提示。

最佳答案

安德斯,

我最近做了一个类似的任务。查看您的代码,您似乎将 DataContract Name 和 Namespace 设置错了。在 Skill 类和 SkillCollection 类之上,您需要指定:[DataContract(Name = "Skills", Namespace = "")]。这对于“允许”序列化程序进入属性至关重要。请记住,仅仅将它设置在 SkillCollection 类之上是不够的。

编辑:我最初认为您可以省略 Namespace,但您不能。如果您未在 XML 中指定 namespace ,则必须将其设置为 Namespace="",如果您指定 namespace ,则必须将其设置为您指定的 namespace 。

此外,调试它的一种方法是将 Deser 方法更改为:

    public static object Deserialize(string path, Type toType)
{
using (var sr = new FileStream(path, FileMode.Open))
{
SkillCollection p = null;
XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(sr, new XmlDictionaryReaderQuotas());
var serializer = new DataContractSerializer(toType);

while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
if (serializer.IsStartObject(reader))
{
Console.WriteLine(@"Found the element");
p = (SkillCollection)serializer.ReadObject(reader);
Console.WriteLine("{0} {1} id:{2}",
p.Slash.ToString(), p.Summon.ToString());
}
Console.WriteLine(reader.Name);
break;
}
}

return p;
}
}

关于c# - 如何调试 XML 反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25961179/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com