Saya mencari cara mudah untuk memeriksa apakah suatu objek di C # dapat bersambung.
Seperti yang kita ketahui, Anda membuat objek dapat diserialkan dengan mengimplementasikan antarmuka ISerializable atau dengan menempatkan [Serializable] di bagian atas kelas.
Apa yang saya cari adalah cara cepat untuk memeriksa ini tanpa harus mencerminkan kelas untuk mendapatkan atributnya. Antarmuka akan cepat menggunakan pernyataan is .
Menggunakan saran @ Flard, ini adalah kode yang saya buat, berteriak apakah ada cara yang lebih baik.
private static bool IsSerializable(T obj)
{
return ((obj is ISerializable) || (Attribute.IsDefined(typeof (T), typeof (SerializableAttribute))));
}
Atau bahkan lebih baik hanya mendapatkan tipe objek dan kemudian menggunakan properti IsSerializable pada tipe:
typeof(T).IsSerializable
Ingat meskipun ini tampaknya hanya kelas yang kita hadapi jika kelas tersebut berisi kelas lain, Anda mungkin ingin memeriksa semuanya atau mencoba dan membuat serial dan menunggu kesalahan seperti yang ditunjukkan @pb.
sumber
Jawaban:
Anda memiliki properti yang indah di
Type
kelas yang disebutIsSerializable
.sumber
Anda harus memeriksa semua jenis dalam grafik objek yang diserialkan untuk atribut serializable. Cara termudah adalah mencoba membuat serial objek dan menangkap pengecualian. (Tapi itu bukan solusi terbersih). Type.IsSerializable dan memeriksa atribut serializalbe tidak memperhitungkan grafik.
Sampel
sumber
Ini adalah pertanyaan lama, yang mungkin perlu diperbarui untuk .NET 3.5+. Type.IsSerializable sebenarnya bisa mengembalikan false jika kelas menggunakan atribut DataContract. Ini cuplikan yang saya gunakan, jika bau, beri tahu saya :)
sumber
null
pemeriksaan dan kembali jikatrue
?Gunakan Type.IsSerializable seperti yang ditunjukkan orang lain.
Mungkin tidak ada gunanya mencoba merefleksikan dan memeriksa apakah semua anggota dalam grafik objek dapat diserialkan.
Anggota dapat dideklarasikan sebagai tipe yang dapat diserialkan, tetapi pada kenyataannya dibuat sebagai tipe turunan yang tidak dapat diserialkan, seperti dalam contoh yang dibuat berikut:
Oleh karena itu, meskipun Anda menentukan bahwa contoh tertentu dari tipe Anda dapat diserialkan, Anda tidak dapat secara umum memastikan ini akan benar untuk semua contoh.
sumber
Mungkin melibatkan refleksi di bawah air, tetapi cara yang paling sederhana?
sumber
Berikut adalah variasi 3.5 yang membuatnya tersedia untuk semua kelas menggunakan metode ekstensi.
sumber
Saya mengambil jawaban atas pertanyaan ini dan jawabannya di sini dan memodifikasinya sehingga Anda mendapatkan Daftar jenis yang tidak dapat diserialkan. Dengan begitu Anda dapat dengan mudah mengetahui mana yang harus ditandai.
Dan kemudian Anda menyebutnya ...
Saat dijalankan, nonSerializableTypes akan memiliki daftarnya. Mungkin ada cara yang lebih baik untuk melakukan ini daripada meneruskan List kosong ke metode rekursif. Seseorang mengoreksi saya jika demikian.
sumber
Objek pengecualian mungkin dapat diserialkan, tetapi menggunakan pengecualian lain yang tidak. Inilah yang baru saja saya alami dengan WCF System.ServiceModel.FaultException: FaultException dapat diserialkan tetapi ExceptionDetail tidak!
Jadi saya menggunakan yang berikut ini:
sumber
Solusi saya, di VB.NET:
Untuk Objek:
Untuk Jenis:
sumber