Menggunakan C # .NET 2.0, saya memiliki kelas data komposit yang memang memiliki [Serializable]
atribut di atasnya. Saya membuat XMLSerializer
kelas dan meneruskannya ke konstruktor:
XmlSerializer serializer = new XmlSerializer(typeof(DataClass));
Saya mendapat pengecualian yang mengatakan:
Ada kesalahan yang mencerminkan jenis.
Di dalam kelas data ada objek komposit lain. Apakah ini juga perlu memiliki [Serializable]
atribut, atau dengan memilikinya pada objek teratas, apakah itu menerapkannya secara rekursif ke semua objek di dalam?
IList
ketika perluList
.Ingat bahwa kelas serial harus memiliki konstruktor default (yaitu parameterless). Jika Anda tidak memiliki konstruktor sama sekali, itu bagus; tetapi jika Anda memiliki konstruktor dengan parameter, Anda harus menambahkan yang default juga.
sumber
Saya memiliki masalah yang sama, dan ternyata serializer tidak dapat membedakan antara 2 kelas yang saya miliki dengan nama yang sama (satu adalah subkelas dari yang lain). Pengecualian batin terlihat seperti ini:
'Type BaseNamespace.Class1' dan 'BaseNamespace.SubNamespace.Class1' keduanya menggunakan nama tipe XML, 'Class1', dari namespace ''. Gunakan atribut XML untuk menentukan nama XML unik dan / atau namespace untuk jenisnya.
Di mana BaseNamespace.SubNamespace.Class1 adalah subclass dari BaseNamespace.Class1.
Apa yang perlu saya lakukan adalah menambahkan atribut ke salah satu kelas (saya menambahkan ke kelas dasar):
Catatan: Jika Anda memiliki lebih banyak lapisan kelas, Anda perlu menambahkan atribut ke mereka juga.
sumber
Perlu diketahui juga bahwa
XmlSerializer
tidak dapat membuat serial properti abstrak .. Lihat pertanyaan saya di sini (yang telah saya tambahkan kode solusinya) ..Serialisasi dan Jenis Warisan XML
sumber
Alasan paling umum menurut saya:
sumber
Semua objek dalam grafik serialisasi harus serial.
Karena
XMLSerializer
ini adalah kotak hitam, periksa tautan ini jika Anda ingin men-debug lebih jauh ke dalam proses serialisasi.Mengubah tempat XmlSerializer Menghasilkan Sidang Sementara
CARA UNTUK: Debug ke .NET XmlSerializer Generated Assembly
sumber
Jika Anda perlu menangani atribut tertentu (mis. Kamus, atau kelas apa pun), Anda dapat mengimplementasikan antarmuka IXmlSerialiable , yang akan memberi Anda lebih banyak kebebasan dengan biaya lebih banyak coding verbose .
Ada artikel yang menarik , yang menunjukkan cara elegan untuk mengimplementasikan cara canggih untuk "memperluas" XmlSerializer.
Artikel itu mengatakan:
Karena ini, saya sarankan untuk mengimplementasikan
IXmlSerializable
kelas Anda sendiri , untuk menghindari implementasi yang terlalu rumit.... bisa langsung menerapkan
XmlSerializer
kelas kebiasaan kami menggunakan refleksi.sumber
Saya telah menemukan bahwa kelas Kamus di .Net 2.0 tidak bisa serial menggunakan XML, tetapi membuat serialisasi dengan baik ketika serialisasi biner digunakan.
Saya menemukan pekerjaan di sekitar sini .
sumber
Baru-baru ini saya mendapatkannya di kelas parsial referensi web saat menambahkan properti baru. Kelas yang dibuat secara otomatis menambahkan atribut berikut.
Saya perlu menambahkan atribut serupa dengan urutan yang lebih tinggi dari yang terakhir dalam urutan yang dibuat secara otomatis dan ini memperbaikinya untuk saya.
sumber
Saya baru saja mendapatkan kesalahan yang sama dan menemukan bahwa properti tipe
IEnumerable<SomeClass>
adalah masalahnya. TampaknyaIEnumerable
tidak dapat diserialisasi secara langsung.Sebaliknya, orang bisa menggunakan
List<SomeClass>
.sumber
Saya juga berpikir bahwa atribut Serializable harus ada di objek tetapi kecuali jika saya menjadi noob lengkap (saya di tengah sesi pengkodean tengah malam) karya-karya berikut dari SnippetCompiler :
Saya akan membayangkan bahwa XmlSerializer menggunakan refleksi atas properti publik.
sumber
Saya memiliki situasi di mana Ordo itu sama untuk dua elemen berturut-turut
.... beberapa kode ...
Ketika saya mengubah kode untuk menambah urutan dengan satu untuk setiap Properti baru di kelas, kesalahan hilang.
sumber
Saya mendapatkan kesalahan yang sama ketika saya membuat properti yang memiliki tipe data -
Type
. Tentang ini, saya mendapatkan kesalahan - Ada jenis kesalahan yang mencerminkan. Saya terus memeriksa 'InnerException' dari setiap pengecualian dari dock debug dan mendapatkan nama bidang spesifik (yangType
) dalam kasus saya. Solusinya adalah sebagai berikut:sumber
Juga perhatikan bahwa Anda tidak dapat membuat serial kontrol antarmuka pengguna dan bahwa objek apa pun yang ingin Anda lewati ke clipboard harus dapat serial jika tidak dapat dilewatkan ke proses lain.
sumber
Saya telah menggunakan
NetDataSerialiser
kelas untuk membuat serialkan kelas domain saya. Kelas NetDataContractSerializer .Kelas domain dibagi antara klien dan server.
sumber
Saya memiliki masalah yang sama dan dalam kasus saya objek memiliki ReadOnlyCollection. Koleksi harus menerapkan metode Tambahkan agar dapat serial.
sumber
Saya memiliki solusi yang sedikit berbeda untuk semua yang dijelaskan di sini sejauh ini, jadi untuk setiap peradaban masa depan di sini milik saya!
Saya telah mendeklarasikan tipe data "waktu" karena tipe aslinya adalah a
TimeSpan
dan kemudian diubah menjadiString
:Namun tipe yang sebenarnya adalah string
dengan menghapus
DateType
properti tersebutXml
dapat diserialisasisumber
Atau
sumber