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

时间:2013-07-23 17:49:20

标签: c# xmlserializer xml-deserialization

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

SELECT 
    usrs.FirstName AS 'FirstName',
    usrs.LastName AS 'LastName',
    usrs.Username AS 'Username',
    usrs.DateJoined AS 'DateJoined'
FROM USERS AS usrs
WHERE usrs.Username = @username
FOR XML PATH('UserProfile')

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

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

DeserializeXML<T>()方法:

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

最后是UserProfile类:

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

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

2 个答案:

答案 0 :(得分:8)

您已使用[XmlAttribute]标记了属性,但xml将这些值包含为元素而非属性。

答案 1 :(得分:0)

我遇到了将反序列化返回为null的相同问题。 我错误地键入了Element名称,如下所示 [XmlElement(ElementName =&#34; fname&#34;)]

正确的是 - [XmlElement(ElementName =&#34; firstname&#34;)]

正如所有人都犯了这个错误一样。