Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Jika aplikasi Anda melakukan serialisasi dan deserialisasi objek, Anda mungkin perlu menambahkan entri ke file arahan runtime (.rd.xml) Anda untuk memastikan bahwa metadata yang diperlukan ada saat runtime. Ada dua kategori serializer, dan masing-masing memerlukan penanganan yang berbeda dalam file arahan runtime Anda:
Serializer pihak ketiga berbasis refleksi. Ini memerlukan modifikasi pada file arahan runtime Anda, dan dibahas di bagian berikutnya.
Serializer yang tidak berbasis refleksi ditemukan di pustaka kelas .NET Framework. Ini mungkin memerlukan modifikasi pada file arahan runtime Anda, dan dibahas di bagian serializer Microsoft.
Serializer dari pihak ketiga
Serializer pihak ketiga, termasuk Newtonsoft.JSON, biasanya berbasis refleksi. Mengingat objek besar biner (BLOB) dari data berseri, bidang dalam data ditetapkan ke jenis konkret dengan mencari bidang jenis target berdasarkan nama. Minimal, menggunakan pustaka ini menyebabkan pengecualian MissingMetadataException untuk setiap objek Type yang Anda coba serialisasi atau deserialisasi dalam koleksi List<Type>.
Cara yang paling mudah untuk mengatasi masalah yang disebabkan oleh metadata yang hilang untuk serializer ini adalah dengan mengumpulkan jenis yang akan digunakan dalam serialisasi di bawah namespace tunggal (seperti App.Models) dan menerapkan arahan metadata Serialize padanya:
<Namespace Name="App.Models" Serialize="Required PublicAndInternal" />
Untuk informasi tentang sintaks yang digunakan dalam contoh, lihat <Elemen Namespace>.
Serializer Microsoft
DataContractSerializerMeskipun kelas , DataContractJsonSerializer, dan XmlSerializer tidak mengandalkan refleksi, kelas tersebut memerlukan kode untuk dihasilkan berdasarkan objek yang akan diserialisasikan atau dideserialisasi. Konstruktor yang kelebihan beban untuk setiap serializer menyertakan parameter Type yang menentukan jenis yang akan diserialisasikan atau dideserialisasi. Bagaimana Anda menentukan jenis tersebut dalam kode Anda menentukan tindakan yang harus Anda ambil, seperti yang dibahas di dua bagian berikutnya.
typeof yang digunakan dalam konstruktor
Jika Anda memanggil konstruktor kelas serialisasi ini dan menyertakan jenis C# operator dalam panggilan metode, Anda tidak perlu melakukan pekerjaan tambahan apa pun. Misalnya, dalam setiap panggilan berikut ke konstruktor kelas serialisasi, typeof kata kunci digunakan sebagai bagian dari ekspresi yang diteruskan ke konstruktor.
XmlSerializer xmlSer = new XmlSerializer(typeof(T));
DataContractSerializer dataSer = new DataContractSerializer(typeof(T));
DataContractJsonSerializer jsonSer = new DataContractJsonSerializer(typeof(T));
Pengkompilasi .NET Native akan secara otomatis menangani kode ini.
Operator typeof digunakan di luar konstruktor
Jika Anda memanggil konstruktor kelas serialisasi ini dan menggunakan operator C# typeof di luar ekspresi yang diteruskan ke parameter Type dari konstruktor, seperti dalam kode berikut, pengkompilasi .NET Native tidak dapat menentukan tipe:
Type t = typeof(DataSet);
XmlSerializer ser = new XmlSerializer(t);
Dalam hal ini, Anda harus menentukan jenis dalam file arahan runtime dengan menambahkan entri seperti ini:
<Type Name="DataSet" Browse="Required Public" />
Demikian pula, jika Anda memanggil konstruktor seperti XmlSerializer(Type, Type[]) dan menyediakan array objek tambahan Type untuk diserialisasikan, seperti dalam kode berikut, pengkompilasi .NET Native tidak dapat menyelesaikan jenis ini.
XmlSerializer xSerializer = new XmlSerializer(typeof(Teacher),
new Type[] { typeof(Student),
typeof(Course),
typeof(Location) });
Tambahkan entri seperti berikut ini untuk setiap jenis ke file arahan runtime:
<Type Name="t" Browse="Required Public" />
Untuk informasi tentang sintaks yang digunakan dalam contoh, lihat <Type> Element.
Lihat juga
- Direktif Waktu Jalan (rd.xml) Referensi Berkas Konfigurasi
- Runtime Directive Elements
- <Jenis> Elemen
- <Namespace> Elemen