Ari*_*edi 4 c# xml-deserialization xmlserializer
我在数据库中有一个存储过程,它返回一个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')
Run Code Online (Sandbox Code Playgroud)
请注意,这Username是一个主键,因此存储过程将只返回一个结果.示例查询结果如下所示:
<UserProfile>
<FirstName>Chuck</FirstName>
<LastName>Norris</LastName>
<Username>chuck.awesome</Username>
<DateJoined>2013-07-22T06:58:00</DateJoined>
</UserProfile>
Run Code Online (Sandbox Code Playgroud)
现在在应用程序中,这是我获取和反序列化数据的方式:
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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
和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);
}
}
Run Code Online (Sandbox Code Playgroud)
最后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; }
}
Run Code Online (Sandbox Code Playgroud)
现在,当我运行应用程序时,我看到存储过程返回了预期的值,但是,序列化程序返回一个UserProfile所有字段都设置为的对象(字段null除外,由于DateJoined字段不可为空,因此设置为默认值).什么可能出错?我怀疑它可能是对象中的XmlRoot()属性UserProfile,但是再次序列化器不会抛出任何异常,这就是为什么我感到困惑.知道可能出了什么问题吗?提前致谢.
| 归档时间: |
|
| 查看次数: |
9438 次 |
| 最近记录: |