Kapan menggunakan atribut DataContract dan DataMember?


179

Saya sangat bingung tentang DataContractatribut di WCF. Sesuai pengetahuan saya ini digunakan untuk serializating tipe seperti kelas yang ditentukan pengguna. Saya menulis satu kelas yang terbuka di sisi klien seperti ini.

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

Ini berfungsi dengan baik tetapi ketika saya menghapus DataContractdan DataMemberjuga berfungsi dengan baik. Saya tidak mengerti mengapa ini berfungsi dengan baik. Adakah yang bisa memberi tahu saya apa sebenarnya yang digunakan DataContract?

Kontrak layanan saya terlihat seperti ini

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

Jawaban sempurna ada di sini stackoverflow.com/questions/5681842/...
Asif Iqbal

Jawaban:


361

Karena banyak programmer kewalahan dengan atribut [DataContract]dan [DataMember], dengan .NET 3.5 SP1, Microsoft membuat serializer kontrak data menangani semua kelas - bahkan tanpa atribut-atribut tersebut - seperti serializer XML yang lama.

Jadi pada. NET 3.5 SP1, Anda tidak perlu menambahkan kontrak data atau atribut anggota data lagi - jika Anda tidak maka serializer kontrak data akan membuat cerita bersambung semua properti publik di kelas Anda, seperti halnya serializer XML.

NAMUN: dengan tidak menambahkan atribut-atribut itu, Anda kehilangan banyak kemampuan yang berguna:

  • tanpa [DataContract], Anda tidak dapat menentukan namespace XML untuk tempat tinggal data Anda
  • tanpa [DataMember], Anda tidak dapat membuat serial properti atau bidang non-publik
  • tanpa [DataMember], Anda tidak dapat menentukan urutan serialisasi ( Order=) dan DCS akan membuat serial semua properti secara alfabet
  • tanpa [DataMember], Anda tidak dapat menentukan nama lain untuk properti Anda ( Name=)
  • tanpa [DataMember], Anda tidak dapat mendefinisikan hal-hal seperti IsRequired=atau atribut berguna lainnya
  • tanpa [DataMember], Anda tidak dapat meninggalkan properti publik tertentu - semua properti publik akan diserialisasi oleh DCS

Jadi untuk solusi "quick'n'dirty", meninggalkan [DataContract]dan [DataMember]atribut akan bekerja - tapi itu masih ide bagus untuk memilikinya di kelas data Anda - hanya untuk lebih eksplisit tentang apa yang Anda lakukan, dan untuk memberikan diri Anda akses ke semua fitur tambahan yang tidak Anda dapatkan tanpanya ...


maksud Anda secara default semua tipe data ditandai secara internal sebagai serializable dan kami menggunakan DataContract / DataMember untuk membatasi mereka.
santosh singh

2
@Santosh: jika Anda memiliki kelas dengan beberapa properti publik, itu akan diserialisasi oleh WCF Data Contract Serializer, kecuali Anda secara eksplisit menerapkan [DataContract] / [DataMember] .- maka 100% terserah Anda untuk mengatakan apa yang akan diserialisasi dan apa yang tidak
marc_s

36
@Arthis: itu tidak sepenuhnya benar. Pada .NET 3.5 SP1, WCF akan dengan senang hati membuat serialisasi kelas tanpa atribut dan apa pun ... tetapi segera setelah Anda mulai menggunakan salah satu dari atribut itu, maka perilaku "default" ini akan berhenti bekerja - segera setelah Anda memiliki satu di Anda kelas, sejak saat itu, hanya properti-properti dengan atribut ini yang akan diserialisasi. [DataContract][DataMember] [DataMember]
marc_s

4
Oohh! Terima kasih untuk menjelaskan poin itu! Saya akan menggalinya sedikit lebih jauh!
Arthis

6
Youhou! keren!! Terima kasih banyak!
Arthis

16

Dalam hal WCF, kami dapat berkomunikasi dengan server dan klien melalui pesan. Untuk mentransfer pesan, dan dari calon keamanan, kita perlu membuat data / pesan dalam format serial.

Untuk serialisasi data, kami menggunakan atribut [datacontract] dan [datamember]. Dalam kasus Anda jika Anda menggunakan datacontractWCF menggunakan yang DataContractSerializerlain menggunakan WCF XmlSerializeryang merupakan teknik serialisasi default.

Biarkan saya jelaskan secara terperinci:

pada dasarnya WCF mendukung 3 jenis serialisasi:

  1. Xmlserializer
  2. DataContractSerializer
  3. NetDataContractSerializer

XmlSerializer : - Urutan default sama dengan kelas

DataContractSerializer / NetDataContractSerializer : - Pesanan default adalah Abjad

XmlSerializer : - Skema XML Luas

DataContractSerializer / NetDataContractSerializer : - Skema XML dibatasi

XmlSerializer : - Dukungan versi tidak mungkin

DataContractSerializer / NetDataContractSerializer : - Dukungan versi dimungkinkan

XmlSerializer : - Kompatibilitas dengan ASMX

DataContractSerializer / NetDataContractSerializer : - Kompatibilitas dengan .NET Remoting

XmlSerializer : - Atribut tidak diperlukan dalam XmlSerializer

DataContractSerializer / NetDataContractSerializer : - Atribut diperlukan dalam serialisasi ini

jadi apa yang Anda gunakan tergantung pada kebutuhan Anda ...


8

Kontrak data adalah perjanjian formal antara layanan dan klien yang secara abstrak menggambarkan data yang akan ditukar. Artinya, untuk berkomunikasi, klien dan layanan tidak harus berbagi jenis yang sama, hanya kontrak data yang sama. Kontrak data secara tepat mendefinisikan, untuk setiap parameter atau tipe pengembalian, data apa yang diserialisasi (diubah menjadi XML) untuk dipertukarkan.

Windows Communication Foundation (WCF) menggunakan mesin serialisasi yang disebut Data Contract Serializer secara default untuk membuat serial dan deserialisasi data (mengubahnya menjadi dan dari XML). Semua tipe primitif .NET Framework, seperti bilangan bulat dan string, serta tipe tertentu yang diperlakukan sebagai primitif, seperti DateTime dan XmlElement, dapat diserialisasi tanpa persiapan lain dan dianggap memiliki kontrak data default. Banyak tipe .NET Framework juga memiliki kontrak data yang ada.

Anda dapat menemukan artikel lengkapnya di sini.


2
Itu semua benar dan baik-baik saja, tetapi itu tidak benar-benar menjawab pertanyaan OP tentang mengapa serializer kontrak data juga berfungsi tanpa atribut [DataContract] dan [DataMember] di kelas Anda ....
marc_s

Adakah yang bisa memberi tahu saya apa sebenarnya penggunaan DataContract? - saya pikir setidaknya bagian dari pertanyaan tersebut dijawab.
IAbstrak

2

Kontrak data adalah perjanjian formal antara layanan dan klien yang secara abstrak menggambarkan data yang akan ditukar.

Kontrak data dapat bersifat eksplisit atau implisit. Jenis sederhana seperti int, string dll memiliki kontrak data implisit. Objek yang ditentukan pengguna adalah tipe eksplisit atau Kompleks, yang Anda harus mendefinisikan kontrak data menggunakan atribut [DataContract] dan [DataMember].

Kontrak data dapat didefinisikan sebagai berikut:

  • Ini menggambarkan format eksternal data yang dilewatkan ke dan dari operasi layanan

  • Ini mendefinisikan struktur dan jenis data yang dipertukarkan dalam pesan layanan

  • Ini memetakan tipe CLR ke skema XML
  • Ini mendefinisikan bagaimana tipe data serial dan deserialized. Melalui serialisasi, Anda mengubah objek menjadi urutan byte yang dapat ditransmisikan melalui jaringan. Melalui deserialization, Anda merakit kembali objek dari urutan byte yang Anda terima dari aplikasi panggilan.
  • Ini adalah sistem versi yang memungkinkan Anda untuk mengelola perubahan pada data terstruktur

Kita perlu memasukkan referensi System.Runtime. Generalisasi ke proyek. Majelis ini memiliki atribut DataContract dan DataMember.


2
  1. Kontrak data: Ini menentukan bahwa kelas entitas Anda siap untuk proses Serialisasi.

  2. Anggota data: Ini menentukan bahwa bidang tertentu adalah bagian dari kontrak data dan dapat diserialisasi.


0

Juga ketika Anda menelepon dari permintaan http itu akan berfungsi dengan baik tetapi ketika Anda mencoba menelepon dari net.tcp saat itu Anda mendapatkan semua barang semacam ini


0

Atribut DataMember tidak wajib untuk ditambahkan ke data serial. Ketika atribut DataMember tidak ditambahkan, XMLSerializer lama membuat serial data. Menambahkan DataMember menyediakan properti yang berguna seperti pesanan, nama, diperlukan yang tidak dapat digunakan sebaliknya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.