Seri durumdan çıkarıldığında json'dan k__BackingField nasıl kaldırılır


104

Bir xml dosyasını bir .net c # nesnesine serileştirdikten sonra döndürdüğüm json'da k_BackingField alıyorum.

DataContract ve DataMember özniteliğini .net c # nesnesine ekledim ama sonra json, istemci tarafında hiçbir şey almadım.

[XmlRoot("person")]
[Serializable]
public class LinkedIn
{
    [XmlElement("id")]
    public string ID { get; set; }

    [XmlElement("industry")]
    public string Industry { get; set; }

    [XmlElement("first-name")]
    public string FirstName { get; set; }

    [XmlElement("last-name")]
    public string LastName { get; set; }
    [XmlElement("headline")]
}

Döndürülen json örneği:

home: Object
<FirstName>k__BackingField: "Storefront"
<LastName>k__BackingField: "Doors"

Yanıtlar:


45

Otomatik Özellik sözdizimi, sınıf serileştirmede kullanılabiliyorsa aslında önerilmez. Destek alanı olmasının nedeni, derleyici tarafından oluşturulur ve kod her derlendiğinde farklı olabilir. Bu, sınıfta herhangi bir değişiklik yapılmasa bile uyumsuzluk sorunlarına neden olabilir (sadece kodu yeniden derlemek).

DataMember özniteliğinin uygulanmasının bu durumda sorunu çözeceğini düşünüyorum. Ancak, sınıfın serileştirmede kullanılması gerekiyorsa, tam özellikli sözdizimi kullanmanızı tavsiye ederim.


Lol, uzun sürümü uyguladı ve özel alanları client.home: Object _fName: "Storefront" _headline: "StorefrontDoors.NET CEO'su" _id: "" _industry: ""
Yığını Doldurmak

21
Bu veri sözleşmesini çalıştığım her mülke sınıf ve veri üyesinin en üstüne eklemek.
Yığını Doldurmak Yaptığım Şey

3
@ [DataContract] ve [DataMember] için AlumCloud.Com +1. Eklemeyi unutmayın: System.Runtime.Serialization
Ian Newland

109

[Serializable]Sınıfınızdan çıkarın


2
Şimdi neden ilk etapta [Seri hale getirilebilir] 'e ihtiyacım olduğunu düşündüğümü merak ediyorum. Xml serileştirmem onsuz çalışır ve JSON onsuz çalışır.
Rhyous

11
Bu, WCF Hizmetleri ile çalışmaz. RESTful hizmetlerini kullanarak bir yükü iade ederken, [Serileştirilebilir] 'i kaldırırsanız bu herhangi bir veri vermez. System.Runtime.Serialization ekleyin ve sınıf için [DataContract], özellikler için [DataMember] kullanın.
Ian Newland

Bu cevap VE Ian yorumu her iki durumu da kapsıyor gibi görünüyor. WCF'ye veya WCF'ye değil, soru bu.
granadaCoder

1
@Rhyous - Web API'de [Serileştirilebilir] 'e ihtiyacınız yoktur çünkü Web API, nesnelerinizi serileştireceğiniz ve geri göndereceğiniz varsayımıyla kurulur (çünkü temelde tüm fikir budur) - diğer C # uygulamalarında genel olarak Serileştirilebilir nesneleri ayırt etmek için Serializable'a ihtiyacınız var
Jon Story

Teşekkürler, takılı kaldım [Serializable], bu yüzden arka alanların eklenmesi yardımcı oldu.
ohmusama

59

Varsayılan WebApi serileştiricisi, "__BackingField:" sözdizimini c # auto-özelliklerine ekler. Aradığınız olabilecek daha temiz görünümlü json'ı elde etmek için bunu App_Start'ta WebConfig'inize ekleyin.

using Newtonsoft.Json;
...

config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings();

3
Bu sorunu çözdü. Otomatik özelliklerin temiz olduğunu düşünüyorum. Her yerde destek alanlarını kullanmak aptalca görünüyor. ve çok fazla karmaşa ve bazen kafa karışıklığı yaratır.
Romesh D. Niriella

Bu benim için çalıştı. Benim durumumda, zaten WCF ve ASMX web hizmetleri tarafından kullanılan mevcut bir sınıfım vardı, bu yüzden onu yeni WebAPI projem için değiştiremezdim.
samiup

4
Soru, neden WebApi serileştiricisinin varsayılan olarak "__BackingField:" öğesini ekleyeceğidir?
Teoman shipahi

güzel çözüm. benim durumumda, memcache içine [Serializable] kaydetmeyi kullanmam gerekiyor. Seri hale getirilebilir olması gerekir.
Bình Nguyenễn Quang

2
StackOverflow olmadan ne yapardım? Teşekkürler.
camainc

35

[Serializable]Geleneksel yöntemler kullanılarak serileştirilebilecekleri şekilde işaretlenmiş , ancak Web API ile kullanım için JSON'da temiz bir şekilde serileştirmemiz gereken bazı nesnelerimiz var. Ayarlama IgnoreSerializableAttributeiçin trueMicrosoft'un serialisers gibi davrandığını gelen Newtonsoft.Json duracak ve bunun yerine sadece kamu özelliklerini tefrika olur.

TLDR: Bunu WebApiConfig.cs'ye ekleyin:

((Newtonsoft.Json.Serialization.DefaultContractResolver)config.Formatters.JsonFormatter.SerializerSettings.ContractResolver).IgnoreSerializableAttribute = true;

Moderatör: Birkaç kez sorulan bir sorunun gerçekten iyi bir cevabını silmek yerine, lütfen tekrarlanan soruyu silin. Bu, geçerli bir soruya geçerli bir cevaptır.


3
Bu doğru cevap olmalı. Serileştirmeyi kaldırmak veya veri sözleşmesi ve veri üyesi özniteliklerini kullanmak her zaman doğru çözüm değildir.
Houssam Hamdan

Çoğumuz, OP dahil, Webapi veya MVVM kullanmıyoruz ya da ne hakkında konuşuyorsanız. Service.svc ile normal bir soap WCF hizmetine sahip olduğumda app_start ve webapiconfig nedir?
Christian

10

Verileri açığa çıkarmanın basit, kolay ve düzgün yolu Nesnedeki verileri kolay okunabilir ve tutarlı bir biçime sunmamız gerekiyor


Önce [Serializable] öğesini kaldırın

    [Serializable]

şimdi sınıfa [DataContract] ve aşağıdaki örnekte olduğu gibi özellik için [DataMember] ekleyin

[DataContract]
public class UserDiscretion : UserReport
{
    [DataMember]
    public String DiscretionCode { get; set; }
    public String DiscretionDescription { get; set; }
}

Umarım bu yardımcı olur,
teşekkürler.


1
Web API kullanıyorsanız, DataContract ve DataMember özniteliklerini eklemenize gerek yoktur - nesneyi döndürmeniz yeterlidir ve otomatik olarak serileştirilecektir.
Jon Story

Geliştirmeye sıfırdan başlayan biri, bu nedenle, Nesne dönüş türünü sağlayacak Web API'sini kullanmak harika olacaktır. Ancak @ AlumCloud.com sorusu için, eğer mevcut uygulamadaysa sorunu için çözüm şu şekilde olacaktır: Önce [Serializable] 'ı kaldırın, ardından sınıfa [DataContract]' i ve aşağıdaki gibi özellik için [DataMember] ekleyin
Nagendra Upwanshi

1
Bu, sınıflarınıza muazzam miktarda "gürültü" ekler ve esasen gereksizdir (diğer tüm yorumlara bakın). Ancak, gerçekten bunu yapma ihtiyacı hissedilirse, derleme sırasında sizin için kodu eklemek için PostSharp gibi bir şey kullanmanızı tavsiye ederim, böylece sınıflarınızı tüm bu niteliklerle karıştırmasın.
camainc

7

Birkaç seçenek:

  1. [Serializable]Modelden kaldır

  2. Modelinize [DataContract]ve [DataMember]ile birlikte ekleyin[Serializable]

  3. Aşağıdaki satıra ekle App_Start/WebApiConfig.cs

config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings();

3

JSON.NET durumunda yardımcı olabilecek başka bir çözüm. Sınıfı [Newtonsoft.Json.JsonObject] özniteliğiyle işaretlemek yeterli olabilir.

Xsd'den oluşturulan cs sınıflarıyla çalışıyordum ve kısmi sınıfları kullanarak bazı özellikler ekliyordum. Json serileştirmeden sonra bu özellikler k_BackingField ile işaretlendi. Diğer yanıtlarda bahsedilen JsonFormatter ayarları da yardımcı oldu, ancak daha basit olanı kısmi sınıfı [JsonObject] özniteliğiyle işaretlemekti.


2

Özniteliğe DataContractJsonSerializersahip başka bir derlemeden bir sınıfla kullanıyordum Serializable. Çıktı "k__BackingField" içeriyordu. SerializableÖzniteliğin kaldırılması (diğer derlemede) bunu düzeltti. Emin değilim neden.


0

Bu sorunu MVC projenizin içinde gördüğünüzü varsayarsak, @ Html.JsonData kullanımını değiştirmenin oldukça basit olduğunu buldum. İşte geçmişte benim için çalışan bir kod parçası:

<input type="hidden" id="Model" value="@Html.Raw(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model))" />

O kadar zarif değil, bir tutam kadar basit.


0

Sınıfımda aşağıdaki gibi öz referans özellikleri olduğunda bu sorunu yaşadım;

class Person {
 List<Person> Friends { get; set;}
}

Ve bir sonuç vardı, kişi kendisiyle arkadaştı. Sonuç kümemde kendine referans veren nesneler olmadığından emin oldum. Bu yardımcı olur umarım.



0

benim durumumda bu hata Newtonsoft.Json Sürümü içindi, sunucu 6.0.0 sürümünü aradı ve 11.0 sürümüne sahiptim, bu yüzden 6.0.0 sürümünü yüklemem gerekiyordu.


-2

Arkadaşlar, böyle özellikler beyan etmeyin:

public String DiscretionCode { get; set; }
public String DiscretionDescription { get; set; }

Ama eski gibi yardımcı değişkenler yaratın ...

private String discretionCode;

public String DiscretionCode 
{ 
    get { return discretionCode;}
    set { discretionCode = value; }
}

1
Neden? Bir rezonans verebilir misin?
Lucenty

@Lucenty, serileştirirken bunun gibi bir JSON verir .. [{"discreationCode": "x"}].
Ammar Ameerdeen

Ama beklediğim şey bu - JSON verileri bu şekilde serileştiriyor. Ve sanırım auxiliar değişkenler ile kod aynı sonucu verecektir.
Lucenty

k_BackingField, bir otomatik özelliğin serileştirildiğini belirtmek için eklendi. Otomatik mülkü bir mülke ve bir destek alanına yeniden düzenlerseniz, sorun ortadan kalkacaktır. Sanırım bu başlıkta daha iyi çözümler var ama bu işe yarıyor.
timB33
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.