c# - 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
解决方案
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; }
}
推荐阅读
- javascript - 将值从控制器传递到模板引擎 - MVC 和 EJS
- angular - Ionic 3 搜索保存结果如何清除
- python - 写入 csv 时出现 Python 错误。我究竟做错了什么?
- salesforce - Salesforce Java 连接适用于 Sandbox,但不适用于生产
- laravel - 如何更改背包为 laravel 的选择字段上的选项名称
- bash - 学习脚本/编程(开始)
- java - 有没有办法在 Wildfly 中禁用自动 JSON PATCH 应用程序
- tensorflow - TensorBoard - 如何显示所有直方图?
- android - 创建发布版本时 index.android.bundle 未更新
- javascript - 仅当用户按下提交按钮时触发脚本