Saya memiliki kelas yang dapat diserialkan dan salah satu properti di kelas saya menghasilkan Guid
di pengambil. Properti tidak mengimplementasikan penyetel dan diabaikan selama serialisasi. Mengapa demikian dan apakah saya selalu harus menerapkan penyetel agar properti saya dapat diserialkan.
[Serializable]
public class Example
{
[XmlAttribute("id")]
public string Id
{
get
{
return Guid.NewGuid().ToString();
}
}
}
Saya mencoba menerapkan penyetel kosong dan serialisasi dengan benar.
[Serializable]
public class Example
{
[XmlAttribute("id")]
public string Id
{
get
{
return Guid.NewGuid().ToString();
}
set {}
}
}
Pembaruan :
Dapatkah Anda menunjukkan bagaimana saya harus mendefinisikan properti yang nilainya tidak pernah berubah atau yang nilainya dihasilkan secara internal?
c#
.net
xml-serialization
Konstantin Dinev
sumber
sumber
[Serializable]
.Jawaban:
Ini adalah batasannya
XmlSerializer
tidak membuat serialisasi properti hanya-baca, apa yang telah Anda lakukan di contoh kedua Anda pada dasarnya adalah peretasan untuk membuatnya menjadi serial, namun, tidak ada gunanya jika Anda membutuhkannya untuk deserialisasi nanti.Atau Anda dapat beralih menggunakan DataContractSerializer , ini lebih fleksibel.
sumber
[DataMember]
serial menggunakanDataContractSerializer
(hanya-baca atau tidak).XmlSerializer
implementasinya, itu bergantung pada metode penyetel publik.DataContractSerializer
sedikit lebih pintar dalam hal itu (mungkin menggunakan refleksi untuk mengatur bidang di belakang layar).Lihat " Memperkenalkan Serialisasi XML " dalam dokumentasi MSDN. Antara lain, dikatakan:
Selain itu, lihat " Mengapa kelas XML-Serializable membutuhkan konstruktor tanpa parameter "
Juga, IXmlSerializable
Selain jenis di atas yang dapat diserialkan oleh XML Serializer, jenis apa pun yang mengimplementasikan antarmuka IXmlSerializable dapat diserialisasi dan dideserialisasi. Secara khusus, ini berarti bahwa tipe XElement dan XDocument dapat diserialkan.
Lihat " IXmlSerializable Interface ".
sumber
Batasan
XMLSerializer
- Properti tanpa penyetel tidak dapat diserialkan.Tapi Anda bisa menggunakan
DataContractSerializer
untuk membuat serialprivate setter properties
-sumber
jika Anda ingin memiliki penyetel pribadi, dan memiliki objek yang dapat diserialisasi / dideserialisasi, terapkan ISerializable, dan buat konstruktor seperti MyObject (info SerializationInfo, konteks StreamingContext). Sebuah contoh ditemukan di sini .
sumber
Atribut serialisasi digunakan untuk membuat serial dan deserialisasi objek. XmlSerializer akan menganggap bahwa Anda tidak perlu membuat serial properti apa pun yang tidak memiliki penyetel. Setter akan digunakan saat deserialisasi string menjadi objek, karena instance dari objek perlu dibuat dan kemudian setter akan digunakan untuk mengisi nilai properti.
sumber