Saya sangat bingung tentang DataContract
atribut 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 DataContract
dan DataMember
juga 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:
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:
[DataContract]
, Anda tidak dapat menentukan namespace XML untuk tempat tinggal data Anda[DataMember]
, Anda tidak dapat membuat serial properti atau bidang non-publik[DataMember]
, Anda tidak dapat menentukan urutan serialisasi (Order=
) dan DCS akan membuat serial semua properti secara alfabet[DataMember]
, Anda tidak dapat menentukan nama lain untuk properti Anda (Name=
)[DataMember]
, Anda tidak dapat mendefinisikan hal-hal sepertiIsRequired=
atau atribut berguna lainnya[DataMember]
, Anda tidak dapat meninggalkan properti publik tertentu - semua properti publik akan diserialisasi oleh DCSJadi 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 ...sumber
[DataContract]
[DataMember]
[DataMember]
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
datacontract
WCF menggunakan yangDataContractSerializer
lain menggunakan WCFXmlSerializer
yang merupakan teknik serialisasi default.Biarkan saya jelaskan secara terperinci:
pada dasarnya WCF mendukung 3 jenis serialisasi:
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 ...
sumber
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.
sumber
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
Kita perlu memasukkan referensi System.Runtime. Generalisasi ke proyek. Majelis ini memiliki atribut DataContract dan DataMember.
sumber
Kontrak data: Ini menentukan bahwa kelas entitas Anda siap untuk proses Serialisasi.
Anggota data: Ini menentukan bahwa bidang tertentu adalah bagian dari kontrak data dan dapat diserialisasi.
sumber
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
sumber
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.
sumber