0

我正在尝试使用 datacontract 序列化程序将以下 XML 反序列化为一个类。

"<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>"

我的 DataContract 类代码是

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

我无法在这里弄清楚为什么此代码不反序列化列表或成员目标的问题。如果 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);

    }
4

1 回答 1

0

显然 DataContract Serializer 不会序列化列表对象。

我用以下代码解决了上述问题

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()
于 2013-10-29T20:13:32.560 回答