我正在尝试扩展包含各种颜色的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
}
}
当没有中间对象时,这很好用,但现在该中间对象给出了一个空值。任何帮助将不胜感激。
答案 0 :(得分:1)
你的c#代码似乎错了。
尝试改为:
public class GraphColors { ... }
public class Colors
{
public GraphColors DetailColors { get; set; }
}
您的代码似乎期望xml由Colors
元素组成,然后是CombinedColors
元素,然后是DetailColors
,其中还包含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。
答案 1 :(得分:0)
使用完整的属性实现:像这样的东西
private string _Name = "default value";
public string Name
{
get { return _Name; }
set { _Name=value; }
}
或尝试使用对象的构造函数设置其默认值。
class YourClass
{
public YourClass
{
//field default value goes here.
}
}
这将缓解空值。
希望这有帮助。
答案 2 :(得分:0)
这就是我的xml-&gt; json-&gt; 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; }
}