2016-02-05 94 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屬性對其進行修飾。「 –