加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 22:08:17 所属栏目:百科 来源:网络整理
导读:我想知道你是否有关于如何调试以下 XML反序列化的任何提示?我无法让它发挥作用.反序列化器基本上创建了summon和slash实例,但它们的所有属性都是空的.相关课程如下所示. 带反序列化器的SkillCollection类: [DataContract(Name = "Skills",Namespace = "")]p
我想知道你是否有关于如何调试以下 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中指定命名空间,或者您指定命名空间的任何内容,在您指定它的情况下.

此外,调试它的方法是将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;
        }
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读