Warum sind Eigenschaften, ohne einen setter nicht serialisiert
Ich habe eine serialisierbare Klasse und einer der Eigenschaften, die in meiner Klasse generiert eine Guid
im getter. Die Eigenschaft implementiert keine setter-und wird ignoriert, die während der Serialisierung. Warum ist das so und muss ich immer zur Implementierung einer setter, um für meine Eigenschaft serialisiert werden soll.
[Serializable]
public class Example
{
[XmlAttribute("id")]
public string Id
{
get
{
return Guid.NewGuid().ToString();
}
}
}
Ich habe versucht, die Umsetzung eine leere setter und es serialisiert richtig.
[Serializable]
public class Example
{
[XmlAttribute("id")]
public string Id
{
get
{
return Guid.NewGuid().ToString();
}
set {}
}
}
Update:
Kann Sie zeigen auf, wie soll ich das definieren von Eigenschaften, deren Werte nie ändern, oder diejenigen, die Wert für die intern erzeugt?
Das zweite Beispiel serialisieren richtig... Aber was passiert, wenn Sie versuchen, zu Deserialisieren?
Versuchen YAXLib [+,+]
FYI, das XML-Serialisierungsprogramm ignoriert
Mir war nicht bewusst, dass.
Siehe auch force-xml-serialization-to-serialize-readonly-propertyund can-an-internal-setter-of-a-property-be-serialized
Versuchen YAXLib [+,+]
FYI, das XML-Serialisierungsprogramm ignoriert
[Serializable]
.Mir war nicht bewusst, dass.
Siehe auch force-xml-serialization-to-serialize-readonly-propertyund can-an-internal-setter-of-a-property-be-serialized
InformationsquelleAutor Konstantin Dinev | 2012-11-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine Einschränkung der
XmlSerializer
es nicht serialisieren, die nur-lese-Eigenschaften, was Sie getan haben in Ihrem zweiten Beispiel ist im wesentlichen der hack, um es zu serialisieren, es ist jedoch nutzlos, wenn Sie es brauchen, um später Deserialisieren.Alternativ können Sie mit dem Schalter DataContractSerializer, es ist flexibler.
nichts markiert, wie
[DataMember]
serialisiert wird mitDataContractSerializer
(nur-Lesen oder nicht).Ich schrieb das oben, weil ich noch einige compile-Zeit Fehler, wenn ich versucht, das gleiche. Nun, als ich zurück zu meinem code und entfernt die setter, scheint es zu kompilieren einwandfrei. Dies ist eine sehr seltsame und wahrscheinlich die Hausaufgaben für mich die Forschung mehr auf diesem.
Ahhh endlich gefunden, die Quelle meiner Verwirrung. Eine Eigenschaft setter ist nicht erforderlich für die Serialisierung. Jedoch, wenn eine Eigenschaft nicht über eine Set -, die XML-Daten nicht Deserialisieren eines Objekts. Dort, Hausaufgaben fertig.
ja genau, es ist nur eine Einschränkung der
XmlSerializer
Umsetzung stützt sich auf die öffentliche setter-Methode.DataContractSerializer
ist ein bisschen mehr schlau in diesem Sinne (vielleicht mit Reflexion auf das Feld hinter den kulissen).InformationsquelleAutor James
Siehe "Einführung in die XML-Serialisierung" in der MSDN-Dokumentation. Unter anderem heißt es:
Finden Sie auch unter "Warum XML-Serialisierbaren Klasse muss einen parameterlosen Konstruktor"
Auch, IXmlSerializable
Zusätzlich zu den oben genannten Arten, die nicht serialisiert werden kann, indem das XML-Serialisierungsprogramm, jede Art implementiert, die die IXmlSerializable-Schnittstelle können Sie serialisiert und deserialisiert werden. Das bedeutet insbesondere, dass die XElement und XDocument-Typen serialisiert werden kann.
Siehe "IXmlSerializable-Schnittstelle".
InformationsquelleAutor John Saunders
Beschränkung der
XMLSerializer
- Eigenschaften, ohne die setter können nicht serialisiert werden.Aber Sie können
DataContractSerializer
zu serialisierenprivate setter properties
-InformationsquelleAutor Rohit Vats
wenn Sie wollen, um private setter, und haben das Objekt serialisierbar sein/deserializable, impliment ISerializable, und erstellen Sie einen Konstruktor wie MyObject(SerializationInfo info, StreamingContext context). Ein Beispiel ist hier zu finden.
InformationsquelleAutor edamon
Serialisierung Attribute sind zum serialisieren und Deserialisieren von Objekten.
XmlSerializer wird davon ausgegangen, dass Sie brauchen nicht zu serialisieren jede Eigenschaft, die nicht mit einem setter.
Setter verwendet wird, wenn deserialisiert einen string in ein Objekt, da eine Instanz des Objekts erstellt werden muss und dann der setter verwendet wird, füllen Sie den Wert der Eigenschaft.
InformationsquelleAutor Rui Jarimba