it-swarm.dev

Proč nejsou vlastnosti bez setteru serializovány

Mám serializovatelnou třídu a jedna z vlastností v mé třídě generuje Guid v getteru. Vlastnost implementuje žádný setter a během serializace je ignoruje. Proč je to a vždy musím implementovat setr, aby se můj majetek mohl serializovat.

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

Snažil jsem se zavést prázdný setter a ten se serializoval správně.

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

Aktualizace :

Můžete poukázat na to, jak mám definovat vlastnosti, jejichž hodnoty se nikdy nemění, nebo hodnoty, pro které je hodnota vytvořena interně?

83
Konstantin Dinev

Je to omezení XmlSerializer to není serializovat vlastnosti jen pro čtení, to, co jste udělali ve vašem druhém příkladu je v podstatě hack dostat to serializovat, nicméně, je to k ničemu, pokud budete potřebovat k deserialize později.

Alternativně můžete přepnout na DataContractSerializer , je to flexibilnější.

51
James

Viz " Představení XML Serializace " v dokumentaci MSDN. Mimo jiné říká:

Položky, které mohou být serializovány

Pomocí třídy XmlSerializer lze serializovat následující položky:

Public read/write properties and fields of public classes.

Classes that implement ICollection or IEnumerable.

Poznámka:

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

XmlNode objects.

DataSet objects.

Viz také " Proč třída XML-Serializable potřebuje konstruktor bez parametru "


Také IXmlSerializable

Kromě výše uvedených typů, které mohou být serializovány XML Serializerem, může být libovolný typ, který implementuje rozhraní IXmlSerializable, serializován a deserializován. Zejména to znamená, že typy XElement a XDocument mohou být serializovány.

Viz " IXmlSerializable Interface ".

9
John Saunders

Omezení XMLSerializer - Vlastnosti bez setteru nelze serializovat.

DataContractSerializer však můžete použít k serializaci private setter properties -

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

chcete-li mít privátní settery a mít objekt serializovatelný/deserializovatelný, impliment ISerializable a vytvořit konstruktor jako MyObject (SerializationInfo info, StreamingContext kontext). Příklad je zde nalezen .

2
edamon

Serializační atributy se používají k serializaci a deserializaci objektů. XmlSerializer předpokládá, že nemusíte serializovat žádnou vlastnost, která nemá nastavovač. Setter bude použit při deserializaci řetězce do objekt, protože instanci objektu je třeba vytvořit a potom bude nastavovač použit k naplnění hodnoty vlastnosti.

0
Rui Jarimba