Soru .NET WebAPI Serileştirme k_BackingField Sonsuz


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


76
2017-09-08 20:50


Menşei


Bu bana yardımcı oldu: stackoverflow.com/questions/15388452/... - granadaCoder


Cevaplar:


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; }
}

113
2017-09-10 20:46



Öyleydi-- sadece [Seri hale getirilebilir] kaldırmak gerekiyordu. Teşekkürler. - Micah
Teşekkürler Filip, önbellek nedeniyle öznitelikleri tutmak zorunda .. BTW, ben senin blogunun hevesli bir hayranıyım .. devam et! - Stephen Patten
haha çok teşekkürler! - Filip W
Bu sadece korkunç. Microsoft neden olmasın? hİÇ serileştirme söz konusu olduğunda doğru bir şey yapmak? - Chris Marisic
Aşağıda kendi cevabımda gösterdiğim gibi daha genel bir çözüm var. - JotaBe


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.


81
2018-03-18 16:58



Bu çözüm bana iki kere yardım etti! Ve aralarında unutmuştum. - John Gietzen
Bu çözümü, heryerde [DataContract] ve [DataMember] özelliklerinin eklenmesinden çok daha iyi seviyorum. Teşekkür ederim!! - Mark Good
Harika, cazibe gibi çalışıyor! - Roemer
Her zaman kullanman gereken bir şey değil, ama bu net bir numara. Modelleri değiştirme lüksüne sahip olmadığınız ya da kod tabanını derinlemesine yeniden düzenleyemediğiniz dağınık durumlarla karşılaşmanıza yardımcı olan bir levye türüdür. - uygar.raf
Web api kullanıyorsanız ve .net çerçevesinin 4. sürümünü hedefliyorsanız, bunun çalışması için Netwonsoft.Json paketini güncellemeniz gerekir. Update-Package Newtonsoft.Json. - pblack


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ı.


2
2017-09-09 02:22