Aşağıdakileri serileştirdiğimde:
[Serializable]
public class Error
{
public string Status { get; set; }
public string Message { get; set; }
public string ErrorReferenceCode { get; set; }
public List<FriendlyError> Errors { get; set; }
}
Bu iğrenç pisliği alıyorum:
<ErrorRootOfstring xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Printmee.Api">
<_x003C_Errors_x003E_k__BackingField>
An exception has occurred. Please contact printmee support
</_x003C_Errors_x003E_k__BackingField>
<_x003C_LookupCode_x003E_k__BackingField>988232ec-6bc9-48f3-8116-7ff7c71302dd</_x003C_LookupCode_x003E_k__BackingField>
</ErrorRootOfstring>
Ne verir? Bunu nasıl güzel yapabilirim? JSON yanıtları ayrıca k_BackingField içerir
Varsayılan olarak ne kullanmanız gerekmiyor [Serializable]
ne de [DataContract]
Web API ile çalışmak.
Sadece modelinizi olduğu gibi bırakın ve Web API sizin için tüm kamu özelliklerini serileştirir.
Sadece nelerin dahil olduğu hakkında daha fazla kontrol sahibi olmak istiyorsanız, sınıfınızı [DataContract]
ve dahil edilecek özellikler [DataMember]
(çünkü hem DCS hem de JSON.NET bu öznitelikleri yeniden boyutlandırır).
Eğer bir sebepten ötürü [Serializable]
sınıfınızda (yani, bir nedenle bir nedenle, derin kopyalar yaparak bir bellek akışına serileştiriyorsunuz), o zaman arka alan adlarını önlemek için her iki özelliği de birlikte kullanmanız gerekir:
[Serializable]
[DataContract]
public class Error
{
[DataMember]
public string Status { get; set; }
[DataMember]
public string Message { get; set; }
[DataMember]
public string ErrorReferenceCode { get; set; }
[DataMember]
public List<FriendlyError> Errors { get; set; }
}
Daha genel bir çözüm var: Json Serializer'ı yok saymak için yapılandırabilirsiniz. [Serializable]
özniteliği, böylece sınıflarınızdaki özellikleri değiştirmek zorunda kalmazsınız.
Bu yapılandırma değişikliğini uygulama başlangıcında, yani Global.asax'ta yapmalısınız. Application_Start
Etkinlik:
var serializerSettings =
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
var contractResolver =
(DefaultContractResolver)serializerSettings.ContractResolver;
contractResolver.IgnoreSerializableAttribute = true;
Json serileştirme işleminde, serileştirme tarihleriyle ilgili formatlar ve diğer pek çok şey gibi başka değişiklikler de yapabilirsiniz.
Bu sadece Web API JSON serileştirmesi için geçerli olacaktır. Uygulamadaki diğer serileştirmeler (Web API XML serileştirme, MVC JsonResult ...) bu ayardan etkilenmez.
Sınıfınızı işaretlemek için Serializable yerine DataContract kullanmayı deneyin. Neden hakkında daha fazla bilgi için şuna bakın otomatik özellikleri serileştirme konusunda iyi blog yazısı.