Ayarlayıcı olmayan özellikler neden serileştirilmiyor?


101

Serileştirilebilir bir sınıfım var ve sınıfımdaki özelliklerden biri Guidalıcıda bir oluşturuyor . Özellik, ayarlayıcı uygulamaz ve serileştirme sırasında yok sayılır. Neden böyle ve özelliğimin serileştirilmesi için her zaman bir ayarlayıcı uygulamalıyım.

[Serializable]
public class Example
{
    [XmlAttribute("id")]
    public string Id
    {
        get
        {
             return Guid.NewGuid().ToString();
        }
    }
}

Boş bir ayarlayıcı uygulamayı denedim ve doğru şekilde serileştirildi.

[Serializable]
public class Example
{
    [XmlAttribute("id")]
    public string Id
    {
        get
        {
             return Guid.NewGuid().ToString();
        }
        set {}
    }
}

Güncelleme :

Değerleri hiç değişmeyen veya değeri dahili olarak oluşturulan özellikleri nasıl tanımlamalıyım?


1
İkinci örnek doğru bir şekilde serileştiriliyor ... Peki serisini kaldırmaya çalıştığınızda ne oluyor?
LightStriker

YAXLib'i deneyin [+ , + ]
Sina Iravanian

3
Bilginize, XML Serileştirici yok sayıyor [Serializable].
John Saunders

@JohnSaunders bunun farkında değildim.
Konstantin Dinev

Yanıtlar:


60

Bu XmlSerializer, salt okunur özellikleri serileştirmemesinin bir sınırlamasıdır, ikinci örneğinizde yaptığınız şey aslında onu serileştirmek için hacklemektir, ancak daha sonra serileştirmeye ihtiyaç duyarsanız faydasızdır.

Alternatif olarak DataContractSerializer'ı kullanmaya geçebilirsiniz , daha esnektir.


8
DataContractSerializer ayrıca ayarlayıcılar gerektirir. Bu bir sınırlamadır, çünkü onu yalnızca tek bir işlem türü için kullansak da, örneğin seriyi kaldırma diyelim, ancak bildirimlerin her ikisi için de olması gerekir, aksi takdirde serileştirme işlemi bir değeri serileştirmeye çalışırken bir değerle ne yapacağını bilemez. XML nesnelerin içine.
ryadavilli

7
@ryadavilli olarak işaretlenen her şey [DataMember]kullanılarak serileştirilir DataContractSerializer(salt okunur veya değil).
James

1
@James Yukarıdakileri yazdım çünkü aynısını denediğimde bazı derleme zamanı hataları aldım. Şimdi, koduma geri döndüğümde ve ayarlayıcıyı kaldırdığımda, iyi derleniyor gibi görünüyor. Bu çok tuhaf ve muhtemelen bu konuda daha fazla araştırma yapmam için bir ödev.
ryadavilli

3
Ahhh sonunda kafa karışıklığımın kaynağını buldu. Serileştirme için bir özellik belirleyici gerekli değildir. Bununla birlikte, bir özelliğin ayarlayıcısı yoksa, XML bir nesneye göre serileştirilmez. İşte ödev bitti.
ryadavilli

1
@ryadavilli, evet, tam olarak, bu sadece XmlSerializeruygulamanın bir sınırlaması , public setter yöntemine dayanır. DataContractSerializerbu anlamda biraz daha akıllıdır (muhtemelen perde arkasındaki alanı ayarlamak için yansıma kullanmak).
James

10

MSDN belgelerinde " XML Serileştirmeye Giriş " bölümüne bakın . Diğer şeylerin yanı sıra şöyle diyor:

Serileştirilebilen Öğeler

Aşağıdaki öğeler XmlSerializer sınıfı kullanılarak serileştirilebilir:

Public read/write properties and fields of public classes.

Classes that implement ICollection or IEnumerable.

Not:

Only collections are serialized, not public properties.
XmlElement objects.

XmlNode objects.

DataSet objects.

Ayrıca, "bakın Neden XML Serializable sınıf bir parametresiz oluşturucu gerekmez "


Ayrıca, IXmlSerializable

XML Serileştirici tarafından serileştirilebilen yukarıdaki türlere ek olarak, IXmlSerializable arabirimini uygulayan herhangi bir tür serileştirilebilir ve serileştirmesi kaldırılabilir. Özellikle bu, XElement ve XDocument türlerinin serileştirilebileceği anlamına gelir.

Bkz. " IXmlSerializable Interface ".


6

Sınırlama XMLSerializer- Ayarlayıcı olmayan özellikler serileştirilemez.

Ama DataContractSerializerserileştirmek için kullanabilirsiniz private setter properties-

[DataMember]
public string Id
{
    get
    {
         return Guid.NewGuid().ToString();
    }
    private set {}
}

1
Özelliğin bir xml niteliği olarak serileştirilmesi gerekir (orijinal gönderiye bakın). Kodunuz (DataMember özniteliği) bir xml öğesi oluşturur. Bildiğim kadarıyla DataContractSerializer'a bir özelliği bir öğeye değil bir niteliğe dönüştürmesini söylemenin (temiz) bir yolu yoktur. DataContractSerializer güzeldir, ancak bu sınırlamayı her zaman aklınızda tutmanız gerekir.
sth_Weird

2

özel ayarlayıcılara sahip olmak ve nesnenin serileştirilebilir / serileştirilebilir olmasını istiyorsanız, ISerializable'ı tamamlayın ve MyObject (SerializationInfo info, StreamingContext bağlamı) gibi bir kurucu oluşturun. Burada bir örnek bulunur .


0

Serileştirme nitelikleri, nesneleri serileştirmek ve serisini kaldırmak için kullanılır. XmlSerializer, ayarlayıcıya sahip olmayan herhangi bir özelliği serileştirmeniz gerekmediğini varsayar. Bir nesnenin bir örneğinin oluşturulması gerektiğinden, bir dizeyi bir nesneye serisini kaldırırken ayarlayıcı kullanılacaktır ve ardından özellik değerini doldurmak için ayarlayıcı kullanılacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.