【问题标题】:What is the proper way to prepare XML data for serialization/deserialization为序列化/反序列化准备 XML 数据的正确方法是什么
【发布时间】:2010-01-03 02:20:37
【问题描述】:
    <?xml version="1.0" encoding="utf-8" ?>
<Hero>
  <Legion>
    <Andromeda>
      <SpellOne>
        <Name>Comet</Name>
        <Icon>Images/Spell/Andromeda/Spell1.gif</Icon>
        <Action>Target Unit</Action>
        <Description>Andromeda rips a comet from her dimension to hurl at an enemy, damaging and stunning them.</Description>
        <Ranks>
          <First>            
            <ManaCost>95</ManaCost>
            <Cooldown>10 Seconds</Cooldown>
            <Effects>Deals 100 Magic damage and stuns target for 1.75 seconds.</Effects>
            <ExtraEffects></ExtraEffects>
          </First>
          <Second>
            <ManaCost>110</ManaCost>
            <Cooldown>10</Cooldown>
            <Effects>Deals 175 Magic damage and stuns target for 1.75 seconds.</Effects>
            <ExtraEffects></ExtraEffects>
          </Second>
          <Third>
            <ManaCost>125</ManaCost>
            <Cooldown>10</Cooldown>
            <Effects>Deals 250 Magic damage and stuns target for 1.75 seconds.</Effects>
            <ExtraEffects></ExtraEffects>
          </Third>
          <Fourth>
            <ManaCost>140</ManaCost>
            <Cooldown>10</Cooldown>
            <Effects>Deals 325 Magic damage and stuns target for 1.75 seconds.</Effects>
            <ExtraEffects></ExtraEffects>
          </Fourth>
        </Ranks>
      </SpellOne>

      <SpellTwo>
        <Name>Aurora</Name>
        <Icon>Images/Spell/Andromeda/Spell2.gif</Icon>
        <Action>Target Position</Action>
        <Description>Andromeda shakes the magnetic field of Newerth, causing an Aurora to erupt, damage, and reduce the armor of all enemies in front of her.</Description>
        <Ranks>
          <First>
            <ManaCost>40</ManaCost>
            <Cooldown>15 Seconds</Cooldown>
            <Effects>Deals 25 damage to targets in a line and applies Aurora for 15 seconds.</Effects>
            <ExtraEffects>-5% Base Damage, -2 Armor</ExtraEffects>
          </First>
          <Second>
            <ManaCost>40</ManaCost>
            <Cooldown>15 Seconds</Cooldown>
            <Effects>Deals 50 damage to targets in a line and applies Aurora for 15 seconds.</Effects>
            <ExtraEffects>-10% Base Damage, -3 Armor</ExtraEffects>
          </Second>
          <Third>
            <ManaCost>40</ManaCost>
            <Cooldown>15 Seconds</Cooldown>
            <Effects>Deals 75 damage to targets in a line and applies Aurora for 15 seconds.</Effects>
            <ExtraEffects>-15% Base Damage, -4 Armor</ExtraEffects>
          </Third>
          <Fourth>
            <ManaCost>40</ManaCost>
            <Cooldown>15 Seconds</Cooldown>
            <Effects>Deals 100 damage to targets in a line and applies Aurora for 15 seconds.</Effects>
            <ExtraEffects>-20% Base Damage, -5 Armor</ExtraEffects>
          </Fourth>
        </Ranks>
      </SpellTwo>

所以我的问题是,我的 XML 格式是否正确?这样做的正确方法是什么。只要我学会了为序列化/反序列化准备 XML 数据的正确方法,我不介意从头开始重写 1300 行 XML。

非常感谢。

【问题讨论】:

  • 如何:在 Visual Basic .NET 中序列化和反序列化 XML:support.microsoft.com/kb/316730
  • 我不是在询问序列化的编程方面。我首先需要先学习正确的方法来准备数据。 :D 请帮忙。
  • “准备”数据是什么意思?该问题还询问有关格式而不是“准备”的问题。您能否更具体地说明您的担忧/恐惧/疑虑是什么? (如果有帮助,除了 &lt;SpellOne&gt;, &lt;SpellTwo&gt;...&lt;First&gt;, &lt;Second&gt;... 元素之外,您显示的内容看起来还不错,通过重复 &lt;Spell&gt;&lt;Rank&gt; 元素可以更好地处理。)

标签: c# xml serialization xml-serialization


【解决方案1】:

在您的 XML 中,我突然想到了两件事。如果我们谈论 C# 序列化,您的对象必须具有类似于 SpellOne、SpellTwo 的属性,以及排名“First”、“Second”、“Third”和“Fourth”。

现在,如果这是一成不变的,并且不可能增加/减少等级和/或法术的数量,那可能并不可怕。但是,如果您为某种形式的角色或 5 级添加 SpellThree,则必须更新您的对象。

我可能会建议一些类似的东西

<Spells>
   <Spell id="1" />
   <Spell id="2" /> 
</Spells>

然后拼写结构可以相同,您可以拥有一个带有 List 的 C# 对象,然后将其序列化/反序列化。

除此之外,您的格式看起来还不错。

您可能会尝试的一件事是创建一个简单的小控制台应用程序,创建您的拼写对象,然后将其转换为 XML。看看它输出的结构,这会让你很好地了解如何格式化它。

【讨论】:

    【解决方案2】:

    我过去做过这种事情的一种方法是采取相反的方法——用我喜欢的结构编写域对象,然后将其序列化为 XML。完成后,我将为它编写一个 XSD,以便以后可以轻松地手动编辑 XML。我采用这种方法是因为拥有正确的域对象更为重要,我并不真正关心 XML 的外观,尤其是在我安装了 XSD 之后。

    【讨论】:

      【解决方案3】:
      1. 构建您的可序列化对象模型。

      2. 创建并填充它的一个实例。

      3. 将其序列化为 XML。

      现在您知道输入 XML 的外观了。

      一般来说,只要不乱用各种属性来控制序列化 XML 的格式,作为值类型的每个属性都将如下所示:

      <PropertyName>ValueSerializedToText</PropertyName>
      

      每个引用类型的属性都将如下所示:

      <PropertyName>
          <Property1>Value</Property1>
          <Property2>Value</Property2>
      

      ...等等。

      因此,在您的示例中,人们会期望 XML 反序列化为 Hero 类型的对象,其 Legion 属性包含具有 Andromeda 属性的对象。也就是说,不,这不是您的 XML 应有的样子。

      您实际上将拥有一个具有NameFaction 属性的Hero 对象,可能会像这样序列化:

      <Hero>
         <Faction>Hellbourne</Faction>
         <Name>Corrupted Disciple</Name>
         ...
      

      但是这一切都是在担心错误的事情。您不应该将注意力集中在您希望 XML 是什么样子上。您应该专注于您需要的对象模型的外观。这样做,XML 序列化格式将自行处理。

      【讨论】:

      • 您的回答提供了很好的意见,并且正是我需要的拉耳类型。不过我有一个疑问。我保存到 XML 的所有信息都是从 wiki 网站手工转录的。我真的不明白你所说的“专注于你需要你的对象模型看起来像什么”是什么意思。这两者是互斥的吗?
      • 你的程序的重点是对这些数据做一些事情,对吧?将程序设计为做它想做的任何事情,而不用担心它要读取的 XML 会是什么样子。这是您应该关心的事情列表中非常低的实现细节。你写程序是为了什么?我的意思是,我知道这是给 HoN 的,你可能从我的例子中可以看出,但它的目的是什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      相关资源
      最近更新 更多