2013-07-23 5 views
2

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가 어떤 예외도 던지지 않기 때문에 혼란 스럽습니다. 어떤 생각이 잘못 될지 모릅니다. 미리 감사드립니다.

+0

왜 ORM/SqlCommand가 더 간단 할 때 Xml 직렬화를 사용하는지 묻습니다. – Romoku

+0

@Romoku 데이터베이스에서 반환 된 XML은 결국 다른 XML 스트림과 병합되고 병합 된 스트림은 deserialize됩니다. – PoweredByOrange

답변

6

[XmlAttribute]으로 속성을 표시했지만 xml에 이러한 값이 속성이 아닌 요소로 포함되어 있습니다.

+1

아 ... 이런 작은 실수 ... 고마워! – PoweredByOrange

0

동일한 직렬화 해제 문제가 null로 반환되었습니다. 내가 잘못 [XMLELEMENT (ElementName을 = "FNAME")]

아래와 같은 요소 이름을 입력 한 올바른 하나 - [XMLELEMENT (ElementName을 = "FIRSTNAME")] 마찬가지로 참고로 사람의 경우

이 실수를 저지른다.

관련 문제