首页 > 解决方案 > WCF REST 无法反序列化实现 IXMLSerializable 的类

问题描述

我有已转换为休息的 WCF 项目。我很难为其类型实现 IXMLSerializable 的属性接收正确的值

[Serializable]
[DataContract]
[XmlType(TypeName = "Dimension")]
[XmlInclude(typeof(SharedDimension))]
public class Dimension
{
    [DataMember] 
    public string Id {get;set}

    //[DataMember] 
    [XmlElement(ElementName = "Members")]
    public Members Members { get; set; }

    // another properties of Dimension class
}


[Serializable]
 //[XmlSchemaProvider("GetSchema")]
[XmlSerializerFormat]
[XmlRoot]
 public class Members: IXMLSerializable 
 public List<Member> Items
 {
    get
    {
    //code that use the IXMLSerializable goes here
    }
    set
    {
    //code that use the IXMLSerializable goes here
    }
}

// another properties of Members class


public System.Xml.Schema.XmlSchema GetSchema()
{
    return null;
}

[Serializable]
[XmlType(TypeName = "Member")]
public class Member : Equatable<Member>, ICodrObject
{
    // properties of Member class
}

public interface IService
{
    [OperationContract]
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "/ProcessDimensions")]
    bool ProcessDimensions(int productId, List<Dimension> dimensions);

    // another end points
}
public class Service implements IService
{
    bool ProcessDimensions(int productId, List<Dimension> dimensions){
    //  code goes here 
}

从邮递员那里调用这个终点,productId,Dimension.Id 具有正确的值,但 Dimension.Members 为 NULL

{
    "productId": 000000,
    "dimensions": [{
        "Id": "D1",
        "Members": {
            "ID": "M1.1",
            "Items": [{
                "Id": 1
            }]
        }
    },
    {
        "Id": "D2",
        "Members": {
            "ID": "M2.1",
            "Items": [{
                "Id": 1
            }]
        }
    }]
}

我仍在使用 .NET Framework 4.6.1

标签: c#apiwcf

解决方案


JSON您的数据格式没有问题。取消注释该[DataMember]语句将解决问题。

//[DataMember] 
[XmlElement(ElementName = "Members")]
public Members Members { get; set; }

尽管您说您正在使用XmlSerializer,但您实际上是在使用DataContractSerializer整个服务。 DataContractSerializer是 WCF 中的默认序列化程序,其中包括没有用[DataContract]. 如果我们要手动切换到XmlSerializer,我们应该使用[XmlSerializerFormat]来装饰服务契约。
有关详细信息,
https:
//docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/using-the-xmlserializer-class 如果有什么我可以帮助的,请随时告诉我。
更新。
请删除相关XMlserializer属性,它可能会干扰DataContractSerializer. 请考虑以下定义。

    [DataContract]
    public class Dimension
    {
        [DataMember]
        public string Id { get; set; }
        [DataMember]
        public Members Members { get; set; }

    }

    //DataContractSerializer is the serializer by default.
    public class Members
    {
        public string ID { get; set; }
        public List<Member> Items { get; set; }    
    }
    public class Member 
    {
        public int Id { get; set; }
}

推荐阅读