XML 스트림을 반환하는 데이터베이스에 저장 프로 시저가 있고 응용 프로그램에서 해당 개체를 해당 개체로 deserialize합니다. 저장 프로 시저가 다음과 같이 정의된다 (나는 그것이 더 읽을 수 있도록 그것을 간체) : 저장 프로 시저가 하나의 결과를 반환 할 수 있도록 Username
는 기본 키입니다XML serializer가 개체 역 직렬화시 null을 반환합니다.
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')
공지있다. 데이터 이것이 내가 얼마나입니다, 응용 프로그램 지금
<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; }
}
이제 응용 프로그램을 실행할 때 저장된 프로 시저가 예상 값을 반환하지만 일련 번호는 null
(모든 필드가 기본값 인 DateJoined
필드 제외)으로 설정된 UserProfile
개체를 반환합니다. 그것은 nullable 없습니다). 어떤 생각이 잘못 될 수 있습니까? 나는 그것이 UserProfile
객체의 XmlRoot()
속성일지도 모른다고 생각하지만, 다시 serializer가 어떤 예외도 던지지 않기 때문에 혼란 스럽습니다. 어떤 생각이 잘못 될지 모릅니다. 미리 감사드립니다.
왜 ORM/SqlCommand가 더 간단 할 때 Xml 직렬화를 사용하는지 묻습니다. – Romoku
@Romoku 데이터베이스에서 반환 된 XML은 결국 다른 XML 스트림과 병합되고 병합 된 스트림은 deserialize됩니다. – PoweredByOrange