2013-10-28 5 views
0

datacontract serializer를 사용하여 다음 XML을 클래스로 deserialize하려고합니다. 를 DataContract 클래스DataContract Serializer 목록을 역 직렬화하지 않는다

"<ns2:MemberCarePlanModel xmlns:ns2=\"http://v3.ua.test.com\"> 
<ns2:memberGoal><ns2:goalDescription>Has received diabetes self-management overview</ns2:goalDescription> 
<ns2:memberId>111111111</ns2:memberId> 
<ns2:goalId>be406994-47a6-4802-8dd6-9616bfbaaead</ns2:goalId> 
</ns2:memberGoal> 
</ns2:MemberCarePlanModel>" 

내 코드이 코드 나던 목록 또는 구성원의 목표를 드 직렬화 왜 여기에 문제를 파악하지 못할

namespace Medventive.Registry.Service.ServiceImplementation.VITALServices 
    { 
[DataContract(Namespace = @"http://v3.ua.test.com")] 
[KnownType(typeof(MemberCareProblemModel))] 
[KnownType(typeof(MemberGoalActivityModel))] 
public class MemberGoalModel 
{ 
    /* 
    * <xs:sequence> 
    <xs:element maxOccurs="unbounded" minOccurs="0" name="careProblem" nillable="true" type="tns:MemberCareProblemModel"/> 
    <xs:element maxOccurs="unbounded" minOccurs="0" name="goalActivity" nillable="true" type="tns:MemberGoalActivityModel"/> 
    <xs:element minOccurs="0" name="goalDescription" type="xs:string"/> 
    <xs:element minOccurs="0" name="memberId" type="xs:string"/> 
    <xs:element minOccurs="0" name="goalId" type="xs:string"/> 
    </xs:sequence> 
    */ 

    //[DataMember(EmitDefaultValue = false, Name = "careProblem", Order = 1)] 
    //public List<MemberCareProblemModel> careProblem { get; set; } 

    //[DataMember(EmitDefaultValue = false, Name = "goalActivity", Order = 2)] 
    //public List<MemberGoalActivityModel> goalActivity { get; set; } 

    [DataMember(EmitDefaultValue = false, Name = "goalDescription", Order = 1)] 
    public string goalDescription { get; set; } 

    [DataMember(EmitDefaultValue = false, Name = "memberId", Order = 2)] 
    public string memberId { get; set; } 

    [DataMember(EmitDefaultValue = false, Name = "goalId", Order = 3)] 
    public string goalId { get; set; } 
    } 
} 


namespace Medventive.Registry.Service.ServiceImplementation.VITALServices 
{ 
[DataContract(Namespace = @"http://v3.ua.test.com", Name="MemberCarePlanModel")] 
[KnownType(typeof(MemberGoalModel))] 
public class MemberCarePlanModel 
{ 

    [DataMember(EmitDefaultValue = false, Name = "memberGoal", Order = 1)] 
    public List<MemberGoalModel> memberGoal { get; set; } 
} 
} 

입니다. if는 carePlan 클래스 내에 memberGoal의 단일 클래스가 있지만 목록에 대해 실패하면 잘 작동합니다.

다음은 내 비 직렬화 코드입니다. xml을 메모리 스트림으로 변환하고 디시리얼라이저로 전달합니다.

 protected static T Deserialize<T>(Stream stream) 
    { 
     DataContractSerializer ser = new DataContractSerializer(typeof(T)); 
     XmlReaderSettings rs = new XmlReaderSettings 
     { 
      ConformanceLevel = ConformanceLevel.Fragment, 
     }; 
     XmlReader r = XmlReader.Create(stream, rs); 
     while (!r.EOF) 
     { 
      T obj = (T)ser.ReadObject(r); 
      return obj; 
     } 

     return default(T); 

    } 
+0

시도, 당신이 잘못있어 위치를 찾을 수 있습니다 그런 식으로 위의 문제를 해결 – VsMaX

답변

0

어쨌든 DataContract Serializer는 목록 개체를 serialize하지 않습니다.

는 다음 코드 예제 클래스를 생성하고 XML로 직렬화

var memberGoals = from v in doc.Root.Descendants(Common.Constants.NameSpace + "memberGoal") 
           select new MemberGoalModel 
           { 
            goalDescription = v.Element(Common.Constants.NameSpace + "goalDescription").Value, 
//Assign Other Properties here. 

           }; 
      //return Deserialize<MemberCarePlanModel>(ms); 
      return memberGoals.ToList()