2016-02-05 91 views
1

我已经创建了一个看起来遵循的WebAPI控制器的方法错误返回复杂对象的列表时,端点出现以下错误:的Web API

Type 'Boligside.ViewModels.RealEstateVm' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. If the type is a collection, consider marking it with the CollectionDataContractAttribute. See the Microsoft .NET Framework documentation for other supported types.

可能是什么问题?我不明白为什么我必须用[DataContractAttribute]标记我的虚拟机?

顺便说一句完整的错误消息是在这里:

This XML file does not appear to have any style information associated with it. The document tree is shown below. An error has occurred. The 'ObjectContent`1' type failed to serialize the response body for content type 'application/xml; charset=utf-8'. System.InvalidOperationException An error has occurred. Type 'Boligside.ViewModels.RealEstateVm' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. If the type is a collection, consider marking it with the CollectionDataContractAttribute. See the Microsoft .NET Framework documentation for other supported types. System.Runtime.Serialization.InvalidDataContractException at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.ThrowInvalidDataContractException(String message, Type type) at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32 id, RuntimeTypeHandle typeHandle, Type type) at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) at System.Runtime.Serialization.XmlObjectSerializerContext.GetDataContract(Int32 id, RuntimeTypeHandle typeHandle) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle) at WriteArrayOfRealEstateVmToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , CollectionDataContract) at System.Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) at System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.DataContractSerializer.WriteObject(XmlWriter writer, Object graph) at System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, HttpContent content) at System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext, CancellationToken cancellationToken) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.WebHost.HttpControllerHandler.d__1b.MoveNext()

回答

5

正如错误说,它不能被序列化,并考虑将数据契约属性..

using System.Runtime.Serialization; 
[DataContract] 
public class RealEstateVm 
    { 
     [DataMember] 
     public int Id { get; set; } 
     [DataMember] 
     public string Title { get; set; } 
     [DataMember] 
     public string Description { get; set; } 
     [DataMember] 
     public int Area { get; set; } 
     [DataMember] 
     public int Rooms { get; set; } 
     [DataMember] 
     public int Rent { get; set; } 
     [DataMember] 
     public string Picture { get; set; } 
     [DataMember] 
     public RealEstateType Type { get; set; } //this is just an enum 
     public string Address { get; set; } 
     [DataMember] 
     public List<string> Images { get; set; } 
     public string Name { get; set; } 
     [DataMember] 
     public string Email { get; set; } 
     [DataMember] 
     public string Phone { get; set; } 
     [DataMember] 
     public string Phone2 { get; set; } 
     [DataMember] 
     public string OriginalUrl { get; set; } 
     [DataMember] 
     public string OriginalSource { get; set; } 
     [DataMember] 
     public string City { get; set; } 
     [DataMember] 
     public int ZipCode { get; set; } 
     [DataMember] 
     public string StreetAddress { get; set; } 
     [DataMember] 
     public double Longtitude { get; set; } 
     [DataMember] 
     public double Latitude { get; set; } 
} 

更多有关Data Contracts

+1

好吧,但我不明白为什么这是必要的。 我特别记得不必为简单类型添加datamember属性。 –

+0

@JeppeKoefod DataContractSerializer是Web API默认使用的选项,它是opt-in; 'XmlSerializer'被选择退出。 –

+0

在http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization中声明“默认情况下,所有公共属性和字段都包含在序列化的JSON。要省略属性或字段,请使用JsonIgnore属性对其进行修饰。“ –