C# 序列化元素值及其属性
我有一个XML格式:C# 序列化元素值及其属性,c#,xml,serialization,C#,Xml,Serialization,我有一个XML格式: <run> <foo status="1">111.9</foo> <fred status="0">5.5</fred> </run> 尝试此操作时,成员foo或fred的值为0 案例2 它可以编译,但在反映Foo_状态时,我得到了一个invalidoOperationException,最里面的异常是“对于非数组类型,您可以使用以下属性:XmlAttribute、XmlText、X
<run>
<foo status="1">111.9</foo>
<fred status="0">5.5</fred>
</run>
尝试此操作时,成员foo或fred的值为0
案例2
它可以编译,但在反映Foo_状态时,我得到了一个invalidoOperationException,最里面的异常是“对于非数组类型,您可以使用以下属性:XmlAttribute、XmlText、XmlElement或XmlAnyElement。”
我该怎么做才能在案例1中得到一个实际值,或者在案例2中没有例外(以及有效的值和状态)
序列化的代码如下所示:
// Case 1
using (var sr = new StreamReader("data.xml"))
{
var xs = new XmlSerializer(typeof(DataBag));
var run = (DataBag)xs.Deserialize(sr);
Console.WriteLine("Got a run: {0}-{1}", run.Fred.Value, run.Fred.Status);
// Issue here is that value is always 0, but status is accurate
}
// case 2
using (var sr = new StreamReader("data.xml"))
{
var xs = new XmlSerializer(typeof(DataBag2));// Exception here
var run = (DataBag2)xs.Deserialize(sr);
Console.WriteLine("Got a run: {0}-{1}", run.Foo, run.Foo_status);
}
谢谢你的关注 您要使用:
向XmlSerializer指示,当包含该成员的类被序列化或反序列化时,该成员必须被视为XML文本
因此:
第二种情况不会像你想的那样奏效。将[xmldattribute(“status”)]
添加到Foo_status
意味着Foo_status
将被序列化为DataBag2
的属性,而不是Foo
。同时应用[xmlement(“foo”)]
表示它是DataBag2
的一个元素,这当然与其他属性冲突
对于外部容器类型,
XmlSerializer
无法指定要应用于嵌套元素的属性 对于案例1,您只需将其标记为XMLText:
[XmlText]
public float Value { get; set; }
回答得好!我现在可以使用简单的序列化模型,而不必从IXmlSerializable派生。
// Case 1
using (var sr = new StreamReader("data.xml"))
{
var xs = new XmlSerializer(typeof(DataBag));
var run = (DataBag)xs.Deserialize(sr);
Console.WriteLine("Got a run: {0}-{1}", run.Fred.Value, run.Fred.Status);
// Issue here is that value is always 0, but status is accurate
}
// case 2
using (var sr = new StreamReader("data.xml"))
{
var xs = new XmlSerializer(typeof(DataBag2));// Exception here
var run = (DataBag2)xs.Deserialize(sr);
Console.WriteLine("Got a run: {0}-{1}", run.Foo, run.Foo_status);
}
public class DataValue
{
[XmlAttribute("status")]
public int Status { get; set; }
[XmlText]
public float Value { get; set; }
}
[XmlText]
public float Value { get; set; }