Serialisasi dan metadata

Jika aplikasi Anda membuat serialisasi dan mendeserialisasi objek, Anda mungkin perlu menambahkan entri ke file arahan runtime Anda (.rd.xml) untuk memastikan bahwa metadata yang diperlukan ada pada durasi. 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 berbasis non-refleksi ditemukan di pustaka kelas .NET Framework. Ini mungkin memerlukan modifikasi pada file arahan runtime Anda, dan dibahas di bagian serializer Microsoft .

Serializer 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 Type objek yang Anda coba serialisasikan atau deserialisasi dalam List<Type> koleksi.

Cara termampu untuk mengatasi masalah yang disebabkan oleh metadata yang hilang untuk serializer ini adalah dengan mengumpulkan jenis yang akan digunakan dalam serialisasi di bawah satu namespace layanan (seperti App.Models) dan menerapkan Serialize arahan metadata ke dalamnya:

<Namespace Name="App.Models" Serialize="Required PublicAndInternal" />

Untuk informasi tentang sintaks yang digunakan dalam contoh, lihat <Namespace> Element.

Serializer Microsoft

DataContractSerializerMeskipun kelas , DataContractJsonSerializer, dan XmlSerializer tidak bergantung pada refleksi, kelas tersebut memerlukan kode untuk dihasilkan berdasarkan objek yang akan diserialisasikan atau dideserialisasi. Konstruktor yang kelebihan beban untuk setiap serializer menyertakan Type parameter yang menentukan jenis yang akan diserialisasikan atau dideserialisasi. Cara 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 operator typeof C# 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.

typeof yang digunakan di luar konstruktor

Jika Anda memanggil konstruktor kelas serialisasi ini dan menggunakan operator typeof C# di luar ekspresi yang diberikan ke parameter konstruktor Type , seperti dalam kode berikut, pengkompilasi .NET Native tidak dapat menyelesaikan jenis:

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