C# XML序列化程序在对象反序列化时返回null

C# XML序列化程序在对象反序列化时返回null,c#,xmlserializer,xml-deserialization,C#,Xmlserializer,Xml Deserialization,我在数据库中有一个存储过程,它返回一个XML流,应用程序将该流反序列化为相应的对象。存储过程的定义如下(我对其进行了简化以使其更具可读性): 请注意,Username是主键,因此存储过程将只返回一个结果。示例查询结果如下所示: <UserProfile> <FirstName>Chuck</FirstName> <LastName>Norris</LastName> <Username>chuck.awesome

我在数据库中有一个存储过程,它返回一个XML流,应用程序将该流反序列化为相应的对象。存储过程的定义如下(我对其进行了简化以使其更具可读性):

请注意,
Username
是主键,因此存储过程将只返回一个结果。示例查询结果如下所示:

<UserProfile>
  <FirstName>Chuck</FirstName>
  <LastName>Norris</LastName>
  <Username>chuck.awesome</Username>
  <DateJoined>2013-07-22T06:58:00</DateJoined>
</UserProfile>

现在,当我运行应用程序时,我看到存储过程返回预期值,但是,序列化程序返回一个
UserProfile
对象,所有字段都设置为
null
(除了
DateJoined
字段,该字段由于不可为null而设置为默认值)。知道会出什么问题吗?我怀疑它可能是
UserProfile
对象中的
XmlRoot()
属性,但是序列化程序没有抛出任何异常,这就是我感到困惑的原因。知道哪里出了问题吗?提前感谢。

您已将属性标记为
[xmldattribute]
,但xml将这些值作为元素而不是属性包含。

我遇到了同样的问题,反序列化返回为null。 我错误地输入了元素名称,如下所示 [xmlement(ElementName=“fname”)]

正确的答案是— [xmlement(ElementName=“firstname”)]


如果有人犯了这个错误,我也可以告诉你。

当ORM/SqlCommand可能更简单时,我可以问你为什么要使用Xml序列化吗?@Romoku从数据库返回的Xml最终会与另一个Xml流合并,并且合并的流会被反序列化。啊。。。这些小错误…谢谢!
<UserProfile>
  <FirstName>Chuck</FirstName>
  <LastName>Norris</LastName>
  <Username>chuck.awesome</Username>
  <DateJoined>2013-07-22T06:58:00</DateJoined>
</UserProfile>
internal static T GetData<T>(StoredProcedures storedProcedure, ParameterList parameters)
    {
        using (var connection = GetSqlConnection())
        {
            using (var command = new SqlCommand(storedProcedure.ToString(), connection))
            {
                command.CommandType = System.Data.CommandType.StoredProcedure;

                foreach (var parameter in parameters)
                {
                    command.Parameters.Add(new SqlParameter(parameter.Key.ToString(), parameter.Value));
                }

                connection.Open();

                var data = command.ExecuteScalar();

                return DeserializeXml<T>(data.ToString());
            }
        }
    }
private static T DeserializeXml<T>(string xmlStream, Type[] additionalTypes = null)
    {
        XmlSerializer serializer;

        if (additionalTypes == null)
        {
            serializer = new XmlSerializer(typeof(T));
        }
        else
        {
            serializer = new XmlSerializer(typeof(T), additionalTypes);
        }

        using (StringReader reader = new StringReader(xmlStream))
        {
            return (T)serializer.Deserialize(reader);
        }
    }
[XmlRoot("UserProfile")]
[Serializable]
public class UserProfile
{
    public UserProfile()
    {
    }

    [XmlAttribute("Username")]
    public string Username { get; set; }

    [XmlAttribute("FirstName")]
    public string FirstName { get; set; }

    [XmlAttribute("LastName")]
    public string LastName { get; set; }

    [XmlAttribute("DateJoined")]
    public DateTime DateJoined { get; set; }
}