DataContract ve DataMember öznitelikleri ne zaman kullanılır?


179

DataContractWCF'deki özellik hakkında çok kafam karıştı . Bildiğim kadarıyla, kullanıcı tanımlı tip gibi sınıfları serileştirmek için kullanılır. Ben müşteri tarafında böyle maruz bir sınıf yazdım.

[DataContract]
public class Contact
{
    [DataMember]
    public int Roll { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Address { get; set; }

    [DataMember]
    public int Age { get; set; }
}

Düzgün çalışıyor ancak kaldırdığımda DataContractve DataMemberdüzgün çalışıyor. Neden düzgün çalıştığını anlayamıyorum. Biri bana gerçek kullanımının ne olduğunu söyleyebilir DataContractmi?

Hizmet sözleşmem şöyle görünüyor

[ServiceContract]    
public interface IRestServiceImpl
{
    [OperationContract]        
    Contact XmlData(string id);      
}

Yanıtlar:


361

Birçok programcı [DataContract]ve [DataMember]öznitelikleri ile boğulmuş olduğundan, .NET 3.5 SP1 ile Microsoft, veri sözleşmesi serileştiricisini eski XML serileştiriciye benzer şekilde bu özniteliklerden herhangi biri olmadan bile tüm sınıfları işlemek için yaptı.

Yani .NET 3.5 SP1 itibariyle, sen yok etmek zorunda veri sözleşme veya veri üye eklemek artık niteliklerini - Aksi takdirde daha sonra veri sözleşme serileştiricisidir classınıza tüm kamu özellikleri serialize sadece XML seri hale yazar gibi.

ANCAK: bu nitelikleri eklemezseniz, birçok yararlı özelliği kaybedersiniz:

  • olmadan [DataContract]verilerinizin yaşaması için bir XML ad alanı tanımlayamazsınız
  • olmadan [DataMember], herkese açık olmayan mülkleri veya alanları serileştiremezsiniz
  • olmadan [DataMember], bir serileştirme sırası ( Order=) tanımlayamazsınız ve DCS tüm özellikleri alfabetik olarak serileştirir
  • olmadan [DataMember], mülkünüz için farklı bir ad tanımlayamazsınız ( Name=)
  • olmadan [DataMember], benzer IsRequired=özellikleri veya diğer yararlı özellikleri tanımlayamazsınız.
  • olmadan [DataMember], belirli genel mülkleri dışarıda bırakamazsınız - tüm genel mülkler DCS tarafından serileştirilir

Bu yüzden "quick'n'dirty" çözümü için, [DataContract]ve [DataMember]özniteliklerini bırakmak işe yarayacaktır - ancak bunları veri sınıflarınızda bulundurmak iyi bir fikirdir - sadece yaptığınız şey hakkında daha açık olmak ve kendinize vermek onlar olmadan elde edemeyeceğiniz tüm ek özelliklere erişim ...


varsayılan olarak tüm veri türleri dahili olarak serileştirilebilir olarak işaretlenir ve bunları kısıtlamak için DataContract / DataMember kullandık.
santosh singh

2
@Santosh: bazı ortak özelliklere sahip bir sınıfınız varsa, açıkça [DataContract] / [DataMember] uygulamadığınız sürece bunlar WCF Veri Sözleşmesi Seri Numarası ile serileştirilecektir. - o zaman serileştirilenleri ve ne değil
marc_s

36
@Arthis: Bu tamamen doğru değil. .NET 3.5 SP1 itibariyle WCF olacak mutlulukla olmadan serialize sınıfları herhangi [DataContract] ve [DataMember]nitelikler ... ama en kısa sürede o zaman bu "varsayılan" davranış çalışmayı durdurur, bu özelliklerden birini kullanarak başlar başlamaz - en kısa sürede bir sahip olarak tek [DataMember] yer senin sınıf, bu noktadan sonra, yalnızca bu özniteliğe sahip özellikler serileştirilir.
marc_s

4
Oohh! Bu noktayı açıklamak için teşekkürler! O zaman biraz daha kazacağım!
Arthis

6
Youhou! kayalar !! Merci beaucoup!
Arthis

16

WCF açısından, mesajlar aracılığıyla sunucu ve müşteri ile iletişim kurabiliriz. İletileri aktarmak için ve bir güvenlik potansiyelinden, serileştirilmiş biçimde bir veri / mesaj oluşturmamız gerekir.

Verileri serileştirmek için [datacontract] ve [datamember] özelliklerini kullanıyoruz. Durumda da kullanıyorsanız datacontractWCF kullanan DataContractSerializerbaşka WCF kullanır XmlSerializervarsayılan seri hale getirme tekniğidir.

Açıklayayım:

temel olarak WCF 3 seri serileşmeyi destekler:

  1. XmlSerializer
  2. DataContractSerializer
  3. NetDataContractSerializer

XmlSerializer : - Varsayılan sipariş sınıfla aynıdır

DataContractSerializer / NetDataContractSerializer : - Varsayılan sipariş Alfabetiktir

XmlSerializer : - XML ​​Şeması Kapsamlıdır

DataContractSerializer / NetDataContractSerializer : - XML ​​Şeması Kısıtlandı

XmlSerializer : - Sürüm oluşturma desteği mümkün değil

DataContractSerializer / NetDataContractSerializer : - Sürüm oluşturma desteği mümkündür

XmlSerializer : - ASMX ile uyumluluk

DataContractSerializer / NetDataContractSerializer : - .NET Remoting ile uyumluluk

XmlSerializer : - XmlSerializer'da özellik gerekli değil

DataContractSerializer / NetDataContractSerializer : - Bu serileştirmede özellik gerekli

yani kullandığınız şey gereksinimlerinize bağlıdır ...


8

Veri sözleşmesi, bir hizmet ile müşteri arasında, değiştirilecek verileri soyut olarak tanımlayan resmi bir sözleşmedir. Yani, iletişim kurmak için, müşteri ve hizmet aynı türleri paylaşmak zorunda değildir, sadece aynı veri sözleşmeleri. Bir veri sözleşmesi, her bir parametre veya dönüş türü için, hangi verilerin alışverişi yapılacak serileştirildiğini (XML'ye dönüştürüldüğünü) tam olarak tanımlar.

Windows Communication Foundation (WCF), verileri serileştirmek ve serisini kaldırmak (XML'ye ve XML'den dönüştürmek) için varsayılan olarak Data Contract Serializer adlı bir serileştirme motoru kullanır. Tamsayılar ve dizeler gibi tüm .NET Framework ilkel türleri ve DateTime ve XmlElement gibi ilkel olarak işlenen belirli türler, başka bir hazırlık yapılmaksızın serileştirilebilir ve varsayılan veri sözleşmeleri olduğu kabul edilir. Birçok .NET Framework türü de mevcut veri sözleşmelerine sahiptir.

Makalenin tamamını burada bulabilirsiniz .


2
Hepsi doğru ve güzel, ama OP'nin veri sözleşmesi serileştiricisinin neden sınıflarınızda [DataContract] ve [DataMember] özellikleri olmadan da çalıştığı sorusuna gerçekten cevap vermiyor ....
marc_s

Herhangi biri bana DataContract'ın gerçek kullanımının ne olduğunu söyleyebilir mi? - Ben sorunun azından bir bölümünün en düşünmek edilir cevap verdi.
IAbstract

2

Veri sözleşmesi, bir hizmet ile müşteri arasında, değiştirilecek verileri soyut olarak tanımlayan resmi bir sözleşmedir.

Veri sözleşmesi açık veya kapalı olabilir. İnt, string vb. Gibi basit türlerin örtük bir veri sözleşmesi vardır. Kullanıcı tanımlı nesne, [DataContract] ve [DataMember] özniteliğini kullanarak bir Veri sözleşmesi tanımlamanız gereken açık veya Karmaşık türdür.

Bir veri sözleşmesi aşağıdaki gibi tanımlanabilir:

  • Hizmet işlemlerine ve hizmet işlemlerinden aktarılan verilerin dış biçimini tanımlar

  • Servis mesajlarında değiş tokuş edilen verilerin yapısını ve türlerini tanımlar

  • Bir CLR türünü bir XML Şemasıyla eşler
  • Veri türlerinin nasıl serileştirildiğini ve serileştirildiğini tanımlar. Serileştirme yoluyla, bir nesneyi bir ağ üzerinden iletilebilen bir bayt dizisine dönüştürürsünüz. Serisini kaldırma işlemi sırasında, bir nesneyi, çağıran bir uygulamadan aldığınız bayt dizisinden yeniden birleştirirsiniz.
  • Yapılandırılmış verilerdeki değişiklikleri yönetmenizi sağlayan bir sürüm sistemidir

Projeye System.Runtime.Serialization referansını eklememiz gerekiyor. Bu derleme DataContract ve DataMember özniteliğini tutar.


2
  1. Veri sözleşmesi: Varlık sınıfınızın Serileştirme işlemine hazır olduğunu belirtir.

  2. Veri üyeleri: Belirli bir alanın veri sözleşmesinin bir parçası olduğunu ve serileştirilebileceğini belirtir.


0

Ayrıca http isteğinden aradığınızda düzgün çalışır, ancak net.tcp'den aramaya çalıştığınızda tüm bu tür şeyleri alırsınız


0

DataMember özniteliğinin serileştirilmiş verilere eklenmesi zorunlu değildir. DataMember özniteliği eklenmediğinde, eski XMLSerializer verileri serileştirir. Bir DataMember eklenmesi, başka türlü kullanılamayan sipariş, ad, gerekli gibi yararlı özellikler sağlar.

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.