Saya memiliki kelas C # yang saya warisi. Saya telah berhasil "membangun" objek. Tapi saya perlu membuat serialisasi objek ke XML. Apakah ada cara mudah untuk melakukannya?
Sepertinya kelas telah diatur untuk serialisasi, tapi saya tidak yakin bagaimana mendapatkan representasi XML. Definisi kelas saya terlihat seperti ini:
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.domain.com/test")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.domain.com/test", IsNullable = false)]
public partial class MyObject
{
...
}
Inilah yang saya pikir bisa saya lakukan, tetapi tidak berhasil:
MyObject o = new MyObject();
// Set o properties
string xml = o.ToString();
Bagaimana saya mendapatkan representasi XML dari objek ini?
c#
xml-serialization
pengguna462166
sumber
sumber
Jawaban:
Anda harus menggunakan XmlSerializer untuk serialisasi XML. Di bawah ini adalah cuplikan sampel.
sumber
XmlWriter writer = XmlWriter.Create(sww);
XmlTextWriter writer = new XmlTextWriter(sww) { Formatting = Formatting.Indented };
alih-alihXmlWriter writer = XmlWriter.Create(sww);
XmlWriter
mengenkapsulasiStringWriter
Anda tidak perlu membuang keduanya (penggunaan pertama adalah redundan), bukan? Saya berasumsiXmlWriter
berhati-hati membuangnya ...XmlWriter
tidak merangkumStringWriter
, itu memanfaatkan pass-in AndaStringWriter
dan tidak memiliki harapan / tanggung jawab untuk membuangnya. SelanjutnyaStringWriter
adalah di luarXmlWriter
ruang lingkup, Anda mungkin masih menginginkannya ketikaXmlWriter
dibuang, itu akan menjadi perilaku yang buruk untukXmlWriter
membuangStringWriter
. Sebagai aturan umum, jika Anda menyatakan sesuatu yang perlu dibuang Anda bertanggung jawab untuk membuangnya. Dan tersirat pada aturan itu, apa pun yang tidak Anda nyatakan sendiri tidak boleh Anda buang. Jadi keduanyausing
diperlukan.Saya memodifikasi tambang untuk mengembalikan string daripada menggunakan variabel ref seperti di bawah ini.
Penggunaannya akan seperti ini:
sumber
Exception
sana, Anda telah memperpanjang StackTrace dengan metode "Serialize <>".Fungsi berikut ini dapat disalin ke objek apa pun untuk menambahkan fungsi penyimpanan XML menggunakan namespace System.Xml.
Untuk membuat objek dari file yang disimpan, tambahkan fungsi berikut dan ganti [ObjectType] dengan tipe objek yang akan dibuat.
sumber
writer.Flush()
adalah berlebihan dalamusing
blok -writer
'sDispose()
metode akan menyiram untuk Anda.Kelas ekstensi:
Pemakaian:
Hanya referensi namespace memegang metode ekstensi Anda dalam file yang Anda ingin menggunakannya dalam dan itu akan bekerja (dalam contoh saya akan:
using MyProj.Extensions;
)Perhatikan bahwa jika Anda ingin membuat metode ekstensi hanya untuk kelas tertentu (mis.,
Foo
), Anda bisa menggantiT
argumen dalam metode ekstensi, mis.public static string Serialize(this Foo value){...}
sumber
Anda dapat menggunakan fungsi seperti di bawah ini untuk mendapatkan XML serial dari objek apa pun.
Anda dapat memanggil ini dari klien.
sumber
Untuk membuat serial objek, lakukan:
Juga ingat bahwa agar XmlSerializer berfungsi, Anda memerlukan konstruktor tanpa parameter.
sumber
Saya akan mulai dengan jawaban salinan dari Ben Gripka:
Saya menggunakan kode ini sebelumnya. Tetapi kenyataan menunjukkan bahwa solusi ini agak bermasalah. Biasanya sebagian besar programmer hanya membuat pengaturan serial pada save dan deserialize pada load. Ini adalah skenario optimis. Setelah serialisasi gagal, karena beberapa alasan, file sebagian ditulis, file XML tidak lengkap dan tidak valid. Karena itu deserialisasi XML tidak berfungsi dan aplikasi Anda mungkin macet saat mulai. Jika file tidak besar, saya sarankan objek bersambung terlebih dahulu untuk
MemoryStream
kemudian menulis aliran ke File. Kasus ini sangat penting jika ada beberapa serialisasi kustom yang rumit. Anda tidak akan pernah bisa menguji semua kasus.Deserialisasi dalam skenario dunia nyata harus dihitung dengan file serialisasi yang rusak, itu terjadi kapan-kapan. Fungsi pemuatan yang disediakan oleh Ben Gripka baik-baik saja.
Dan itu bisa dibungkus dengan beberapa skenario pemulihan. Sangat cocok untuk file pengaturan atau file lain yang dapat dihapus jika ada masalah.
sumber
Semua jawaban yang dipilih di atas benar. Ini hanya versi paling sederhana:
sumber
Ini sedikit lebih rumit daripada memanggil
ToString
metode kelas, tetapi tidak banyak.Berikut adalah fungsi drop-in sederhana yang dapat Anda gunakan untuk membuat serial semua jenis objek. Ini mengembalikan string yang berisi konten XML serial:
sumber
Berikut ini adalah tutorial yang bagus tentang cara melakukan ini
Anda pada dasarnya harus menggunakan
System.Xml.Serialization.XmlSerializer
kelas untuk melakukan ini.sumber
Anda dapat membuat dan menyimpan hasilnya sebagai file xml di lokasi yang diinginkan.
sumber
kode kerja saya. Mengembalikan utf8 xml mengaktifkan namespace kosong.
Contoh pengembalian respons pembayaran Yandex api Aviso url:
sumber
Saya punya cara sederhana untuk membuat serialisasi objek ke XML menggunakan C #, ini berfungsi dengan baik dan sangat bisa digunakan kembali. Saya tahu ini adalah utas yang lebih lama, tetapi saya ingin memposting ini karena seseorang mungkin menganggap ini bermanfaat bagi mereka.
Inilah cara saya memanggil metode:
Inilah kelas yang berfungsi:
Catatan: Karena ini adalah metode ekstensi, mereka harus berada dalam kelas statis.
sumber
Berdasarkan solusi di atas, inilah kelas ekstensi yang dapat Anda gunakan untuk membuat serial dan deserialisasi objek apa pun. Atribusi XML lainnya terserah Anda.
Gunakan saja seperti ini:
sumber
Atau Anda dapat menambahkan metode ini ke objek Anda:
sumber
Berikut adalah kode dasar yang akan membantu membuat serial objek C # ke dalam xml:
sumber
Anda perlu menggunakan kelas-kelas berikut:
sumber