Mam klasę możliwą do serializacji i jedna z właściwości w mojej klasie generuje Guid
w getterze. Właściwość nie implementuje metody ustawiającej i jest ignorowana podczas serializacji. Dlaczego tak jest i czy zawsze muszę implementować metodę ustawiającą, aby moja właściwość została serializowana.
[Serializable]
public class Example
{
[XmlAttribute("id")]
public string Id
{
get
{
return Guid.NewGuid().ToString();
}
}
}
Próbowałem zaimplementować pusty ustawiacz i został on poprawnie zserializowany.
[Serializable]
public class Example
{
[XmlAttribute("id")]
public string Id
{
get
{
return Guid.NewGuid().ToString();
}
set {}
}
}
Aktualizacja :
Czy możesz wskazać, jak mam zdefiniować właściwości, których wartości nigdy się nie zmieniają, lub te, dla których wartość jest generowana wewnętrznie?
c#
.net
xml-serialization
Konstantin Dinev
źródło
źródło
[Serializable]
.Odpowiedzi:
Jest to ograniczenie polegające na
XmlSerializer
tym, że nie serializuje właściwości tylko do odczytu, to, co zrobiłeś w drugim przykładzie, jest zasadniczo hackem, aby go serializować, jednak jest bezużyteczny, jeśli potrzebujesz go później deserializować.Alternatywnie możesz przełączyć się na używanie DataContractSerializer , jest to bardziej elastyczne.
źródło
[DataMember]
serializowane przy użyciuDataContractSerializer
(tylko do odczytu lub nie).XmlSerializer
implementacji, opiera się na publicznej metodzie ustawiającej.DataContractSerializer
jest nieco sprytniejszy w tym sensie (prawdopodobnie wykorzystując refleksję, aby ustawić pole za kulisami).Zobacz „ Wprowadzenie do serializacji XML ” w dokumentacji MSDN. Między innymi mówi:
Zobacz też „ Dlaczego klasa XML-Serializable wymaga konstruktora bez parametrów ”
Ponadto IXmlSerializable
Oprócz powyższych typów, które mogą być serializowane przez serializator XML, można serializować i deserializować każdy typ, który implementuje interfejs IXmlSerializable. W szczególności oznacza to, że typy XElement i XDocument mogą być serializowane.
Zobacz „ Interfejs IXmlSerializable ”.
źródło
Ograniczenie
XMLSerializer
- właściwości bez metody ustawiającej nie mogą być serializowane.Ale możesz użyć
DataContractSerializer
do serializacjiprivate setter properties
-źródło
jeśli chcesz mieć prywatne metody ustawiające i mieć obiekt, który można serializować / deserializować, zaimplementuj ISerializable i utwórz konstruktor, taki jak MyObject (informacje o SerializationInfo, kontekst StreamingContext). Przykład znajduje się tutaj .
źródło
Atrybuty serializacji są używane do serializacji i deserializacji obiektów. XmlSerializer przyjmie, że nie trzeba serializować żadnej właściwości, która nie ma metody ustawiającej. Setter będzie używany podczas deserializacji ciągu do obiektu, ponieważ należy utworzyć wystąpienie obiektu, a następnie ustawiający zostanie użyty do wypełnienia wartości właściwości.
źródło