C# 序列化元素值及其属性

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

我有一个XML格式:

<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; }