Memperluas masalah saya sebelumnya , saya telah memutuskan (de) membuat serial file kelas config saya yang bekerja sangat baik.
Sekarang saya ingin menyimpan array asosiatif huruf drive untuk memetakan (key adalah huruf drive, nilai adalah jalur jaringan) dan telah mencoba menggunakan Dictionary
, HybridDictionary
dan Hashtable
untuk ini, tetapi saya selalu mendapatkan error berikut saat memanggil ConfigFile.Load()
atau ConfigFile.Save()
:
Ada kesalahan yang mencerminkan tipe 'App.ConfigFile'. [snip] System.NotSupportedException: Tidak dapat membuat serialisasi anggota App.Configfile.mappedDrives [snip]
Dari apa yang saya baca Kamus dan HashTable dapat diserialisasi, jadi apa yang saya lakukan salah?
[XmlRoot(ElementName="Config")]
public class ConfigFile
{
public String guiPath { get; set; }
public string configPath { get; set; }
public Dictionary<string, string> mappedDrives = new Dictionary<string, string>();
public Boolean Save(String filename)
{
using(var filestream = File.Open(filename, FileMode.OpenOrCreate,FileAccess.ReadWrite))
{
try
{
var serializer = new XmlSerializer(typeof(ConfigFile));
serializer.Serialize(filestream, this);
return true;
} catch(Exception e) {
MessageBox.Show(e.Message);
return false;
}
}
}
public void addDrive(string drvLetter, string path)
{
this.mappedDrives.Add(drvLetter, path);
}
public static ConfigFile Load(string filename)
{
using (var filestream = File.Open(filename, FileMode.Open, FileAccess.Read))
{
try
{
var serializer = new XmlSerializer(typeof(ConfigFile));
return (ConfigFile)serializer.Deserialize(filestream);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + ex.ToString());
return new ConfigFile();
}
}
}
}
sumber
DataContractSerializer
kelas bisa melakukannya. Hanya hasilnya agak jelek.Ada solusi di Weblog Paul Welter - Kamus XML Serializable Generik
sumber
string
nilai-nilai, tetapi akan menampilkanInvalidOperationException
deserialisasi yang menyebutkan elemen pembungkus yang tidak terduga jika Anda mencoba menyimpan objek khusus atau array string di dalamnya. (Lihat pertanyaan saya untuk contoh masalah yang saya hadapi dengan ini.)Alih-alih menggunakan
XmlSerializer
Anda dapat menggunakan aSystem.Runtime.Serialization.DataContractSerializer
. Ini dapat membuat serial kamus dan antarmuka tidak berkeringat.Berikut ini tautan ke contoh lengkap, http://theburningmonk.com/2010/05/net-tips-xml-serialize-or-deserialize-dictionary-in-csharp/
sumber
Buat pengganti serialisasi.
Contoh, Anda memiliki kelas dengan properti publik dari Kamus jenis.
Untuk mendukung serialisasi Xml jenis ini, buat kelas nilai kunci umum:
Tambahkan atribut XmlIgnore ke properti asli Anda:
Mengekspos properti publik dari tipe array, yang menyimpan sebuah array dari instance SerializableKeyValue, yang digunakan untuk membuat serialisasi dan membatalkan deserialisasi ke dalam properti SearchCategories:
sumber
Anda harus menjelajahi Json.Net, cukup mudah digunakan dan memungkinkan objek Json untuk di-deserialisasi dalam Kamus secara langsung.
james_newtonking
contoh:
sumber
Kamus dan Hashtable tidak bersambung dengan
XmlSerializer
. Karena itu Anda tidak dapat menggunakannya secara langsung. Solusinya adalah dengan menggunakanXmlIgnore
atribut untuk menyembunyikan properti-properti dari serializer dan memaparkannya melalui daftar pasangan kunci-nilai serial.PS: membangun sebuah
XmlSerializer
sangat mahal, jadi selalu cache itu jika ada kesempatan untuk dapat menggunakannya kembali.sumber
Saya ingin kelas SerializableDictionary yang menggunakan atribut xml untuk kunci / nilai jadi saya telah mengadaptasi kelas Paul Welter.
Ini menghasilkan xml seperti:
Kode:
Tes Unit:
sumber
kelas Kamus mengimplementasikan ISerializable. Definisi Kamus Kelas diberikan di bawah ini.
Saya tidak berpikir itu masalahnya. lihat tautan di bawah ini, yang mengatakan bahwa jika Anda memiliki tipe data lain yang tidak bisa serial maka Kamus tidak akan diserialisasi. http://forums.asp.net/t/1734187.aspx?Is+Dictionary+serializable+
sumber
Anda dapat menggunakan ExtendedXmlSerializer . Jika Anda memiliki kelas:
dan buat instance dari kelas ini:
Anda dapat membuat serial objek ini menggunakan ExtendedXmlSerializer:
Output xml akan terlihat seperti:
Anda dapat menginstal ExtendedXmlSerializer dari nuget atau menjalankan perintah berikut:
Ini adalah contoh online
sumber
Artikel ini menjelaskan persis bagaimana cara menangani ini: Bagaimana ... Serialize tabel hash di C # ketika aplikasi membutuhkannya?
Saya harap ini bermanfaat
sumber