C# 反序列化XML为集合属性返回null

C# 反序列化XML为集合属性返回null,c#,xml,deserialization,xmlserializer,C#,Xml,Deserialization,Xmlserializer,我正在尝试反序列化以下XML: <?xml version="1.0" encoding="utf-8" ?> <mf:somedata xmlns:mf="urn:somedata"> <CurrentAccount> <AccountType>test</AccountType> <Charge> <ChargeType>test</Ch

我正在尝试反序列化以下XML:

<?xml version="1.0" encoding="utf-8" ?> 
<mf:somedata xmlns:mf="urn:somedata">
    <CurrentAccount>
        <AccountType>test</AccountType>
        <Charge>
            <ChargeType>test</ChargeType>
        </Charge>
    </CurrentAccount>
    <CurrentAccount>
        <AccountType>test 2</AccountType>
        <Charge>
            <ChargeType>test 2</ChargeType>
        </Charge>
    </CurrentAccount>
</mf:somedata>

测试
测试
测试2
测试2
使用以下类:

[XmlRoot("somedata", Namespace = "urn:somedata")]
public class MfCurrentAccounts
{
    [XmlElement("CurrentAccount")]
    public CurrentAccount[] CurrentAccounts { get; set; }
}

public class CurrentAccount
{
    public string AccountType { get; set; }

    [XmlElement("Charge")]
    public Charge[] Charges { get; set; }
}

public class Charge
{
    public string ChargeType { get; set; }
}

var c = new XmlSerializer(typeof(MfCurrentAccounts)).Deserialize(new StringReader(xml)) as MfCurrentAccounts;

c.CurrentAccounts // <-- is always null
[XmlRoot(“somedata”,Namespace=“urn:somedata”)]
公共类活期账户
{
[XmlElement(“当前账户”)]
公共当前帐户[]当前帐户{get;set;}
}
公共类活期账户
{
公共字符串AccountType{get;set;}
[XmlElement(“费用”)]
公共收费[]收费{get;set;}
}
公共课收费
{
公共字符串ChargeType{get;set;}
}
var c=新的XmlSerializer(typeof(MfCurrentAccounts))。将(新的StringReader(xml))反序列化为MfCurrentAccounts;

c、 CurrentAccounts/也许您应该尝试将MfCurrentAccounts类替换为:

[XmlRoot("somedata", Namespace = "urn:somedata")]
public class MfCurrentAccounts : List<CurrentAccount>
{
   public MfCurrentAccounts():base()
   {}

}
[XmlRoot(“somedata”,Namespace=“urn:somedata”)]
公共类MfCurrentAccounts:列表
{
公共MfCurrentAccounts():base()
{}
}
或者看看


希望这会有所帮助

问题在于名称空间

当我在测试环境中创建整个类设置时,我得到了一个非常不同的输出。以下是我认为您应该尝试阅读的内容:

    <?xml version="1.0"?>
    <mf:somedata xmlns:mf="urn:somedata">
        <mf:CurrentAccount>
            <mf:AccountType>something 1</mf:AccountType>
            <mf:Charge>
                <mf:ChargeType>Charge Type 1</mf:ChargeType>
            </mf:Charge>
        </mf:CurrentAccount>
        <mf:CurrentAccount>
            <mf:AccountType>something 2</mf:AccountType>
            <mf:Charge>
                <mf:ChargeType>Charge Type 2</mf:ChargeType>
            </mf:Charge>
        </mf:CurrentAccount>
    </mf:somedata>
当在中重新阅读时:

ms.Position = 0;
b = ser.Deserialize(ms) as MfCurrentAccounts;

在运行了这两部分之后,b现在是a的完美克隆,我上面展示的xml就是生成的xml。

对不起,用反序列化代码更新了这个问题。你不需要用
[Serializable()]
标记类吗?@François我已经尝试过了,但显然它不是必需的。可能是@Dan-o的重复当这个代码已经按照答案所示做了时,它怎么可能是重复的呢?使用此代码的注释/属性与“重复答案”的唯一区别在于它使用数组而不是列表。谢谢。不幸的是,XML来自第三方,因此我无法控制它。我尝试将此添加到CurrentAccounts属性:
[XmlElement(“CurrentAccount”,Namespace=“urn:somedata”)]
,但无效。在尝试反序列化xml之前,是否可以编辑xml?如果您在第一行使用一些正则表达式并从顶部节点删除“mf:”,那么您将拥有一个统一的classdef,它应该正确地反序列化…@Tom您是否尝试过[xmlement(“CurrentAccount”,Namespace=String.Empty)]?@jbl您是个救命恩人!谢谢!:)@jbl你救了另一个生命,成功了!!只返回一个空列表(不过,我还是会玩玩它,因为它似乎应该会起作用。我会看看如何写入磁盘和使用XSD文件,但我不想走这条路。@Tom这个类可能需要一个公共构造函数。我更新了我的答案,但你对上一个答案的评论也行得通。:)
ms.Position = 0;
b = ser.Deserialize(ms) as MfCurrentAccounts;