0

我正在尝试扩展一个包含各种颜色的 XML 配置文件,目前它看起来像这样。

<Colors>
    <FooColor1>0x0BD000</FooColor1>
    <FooColor2>0x11C711</FooColor2>
    <FooColor3>0x224466</FooColor3>
    <FooColor4>0xAA3333</FooColor4>
    <FooColor5>0x886644</FooColor5>
</Colors>

这些都以字符串的形式出现,一切正常且花花公子。问题就在这里,正如我所说,我正在尝试扩展文件,新格式将是这样的

<Colors>
    <DetailColors>
        <FooColor1>0x0BD000</FooColor1>
    <FooColor2>0x11C711</FooColor2>
    <FooColor3>0x224466</FooColor3>
    <FooColor4>0xAA3333</FooColor4>
    <FooColor5>0x886644</FooColor5>
    </DetailColors>
    <GoalColors>
        //Similar stuff, not actually in yet.
    </GoalColors>
</Colors>

但是,使用单层的序列化样式似乎无法处理嵌套。

[System.SerializableAttribute()]
public class GraphColors
{
  public string FooColor1 { get; set; }
  public string FooColor2 { get; set; }
  public string FooColor3 { get; set; }
  public string FooColor4 { get; set; }
  public string FooColor5 { get; set; }

}
[System.SerializableAttribute()]
public class DetailColors
{
  [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
  public GraphColors ColorSchema { get; set; }
}
[System.SerializableAttribute()]
public class Colors
{
  [System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
  private DetailColors CombinedColors { get; set; }
  public static GraphColors getColorsFromConfig()
  {
     return new XmlSerializer(Colors).Deserialize(path).CombinedColors.ColorSchema
  }
}

当没有中间对象时,这工作得很好,但现在中间对象给出了一个空值。任何帮助将不胜感激。

4

3 回答 3

1

您的 c# 代码似乎是错误的。

改为尝试:

public class GraphColors { ... }

public class Colors
{
    public GraphColors DetailColors { get; set; }
}

您的代码似乎期望 xml 由一个Colors元素组成,然后是一个CombinedColors元素,然后是 a DetailColors,其中还包含 a ColorSchema

使用您的代码,此 xml 可能是有效的:

<Colors>
  <CombinedColors>
    <ColorSchema>
      <FooColor1>...</FooColor1>
      <FooColor2>...</FooColor2>
      <FooColor3>...</FooColor3>
      <FooColor4>...</FooColor4>
      <FooColor5>...</FooColor5>
    </ColorSchema>
  </CombinedColors>
</Colors>

我想你误解了类名和属性名在xml序列化中的作用(而在xml序列化的情况下,[Serializable]属性不是必需的)。

当您序列化一个类时,它是用于创建 xml 元素名称的属性名称。不使用类型名称(仅当类型是 xml 根元素时)。

不要添加这种只添加嘈杂的 xml 元素的中间类。

您还可以通过创建一个序列化示例对象的小应用程序来快速发现序列化的 xml。

于 2012-08-27T16:50:26.320 回答
0

这就是我的 xml->json->csharp 所说的

public class Detailcolors
{
    public int foocolor1 { get; set; }
    public int foocolor2 { get; set; }
    public int foocolor3 { get; set; }
    public int foocolor4 { get; set; }
    public int foocolor5 { get; set; }
}

public class Colors
{
    public Detailcolors detailcolors { get; set; }
    public string goalcolors { get; set; }
}

public class RootObject
{
    public Colors colors { get; set; }
}
于 2012-08-27T16:56:06.493 回答
0

使用完整的属性实现:像这样

private string _Name = "default value";
    public string Name
    {
        get { return _Name; }
        set { _Name=value;  }
    }

或者尝试使用对象的构造函数设置其默认值。

class YourClass
{
    public YourClass
    {
        //field default value goes here.
    }
}

这将缓解空值。

希望这可以帮助。

于 2012-08-27T15:01:01.700 回答