Ich habe eine serialisierbare Klasse und eine der Eigenschaften in meiner Klasse generiert eine Guid
im Getter. Die Eigenschaft implementiert keinen Setter und wird während der Serialisierung ignoriert. Warum ist das so und muss ich immer einen Setter implementieren, damit mein Eigentum serialisiert wird.
[Serializable]
public class Example
{
[XmlAttribute("id")]
public string Id
{
get
{
return Guid.NewGuid().ToString();
}
}
}
Ich habe versucht, einen leeren Setter zu implementieren, der korrekt serialisiert wurde.
[Serializable]
public class Example
{
[XmlAttribute("id")]
public string Id
{
get
{
return Guid.NewGuid().ToString();
}
set {}
}
}
Update :
Können Sie darauf hinweisen, wie ich Eigenschaften definieren soll, deren Werte sich nie ändern oder für die der Wert intern generiert wird?
c#
.net
xml-serialization
Konstantin Dinev
quelle
quelle
[Serializable]
.Antworten:
Es ist eine Einschränkung, dass
XmlSerializer
es keine schreibgeschützten Eigenschaften serialisiert. Was Sie in Ihrem zweiten Beispiel getan haben, ist im Wesentlichen der Hack, um es zur Serialisierung zu bringen. Es ist jedoch nutzlos, wenn Sie es später zum Deserialisieren benötigen.Alternativ können Sie zur Verwendung von DataContractSerializer wechseln , es ist flexibler.
quelle
[DataMember]
serialisiert markiert istDataContractSerializer
(schreibgeschützt oder nicht).XmlSerializer
Implementierung, es basiert auf der Public-Setter-Methode.DataContractSerializer
ist in diesem Sinne etwas schlauer (wahrscheinlich mit Reflexion, um das Feld hinter die Kulissen zu setzen).Siehe " Einführung in die XML-Serialisierung " in der MSDN-Dokumentation. Unter anderem heißt es:
Siehe auch " Warum XML-Serializable-Klassen einen parameterlosen Konstruktor benötigen "
Auch IXmlSerializable
Zusätzlich zu den oben genannten Typen, die vom XML Serializer serialisiert werden können, kann jeder Typ, der die IXmlSerializable-Schnittstelle implementiert, serialisiert und deserialisiert werden. Dies bedeutet insbesondere, dass die Typen XElement und XDocument serialisiert werden können.
Siehe " IXmlSerializable Interface ".
quelle
Einschränkung von
XMLSerializer
- Eigenschaften ohne Setter können nicht serialisiert werden.Aber Sie können verwenden, um
DataContractSerializer
zu serialisierenprivate setter properties
-quelle
Wenn Sie private Setter haben möchten und das Objekt serialisierbar / deserialisierbar sein soll, implementieren Sie ISerializable und erstellen Sie einen Konstruktor wie MyObject (SerializationInfo info, StreamingContext context). Ein Beispiel finden Sie hier .
quelle
Serialisierungsattribute werden zum Serialisieren und Deserialisieren von Objekten verwendet. XmlSerializer geht davon aus, dass Sie keine Eigenschaft serialisieren müssen, die keinen Setter hat. Der Setter wird verwendet, wenn eine Zeichenfolge in ein Objekt deserialisiert wird, da eine Instanz des Objekts erstellt werden muss und der Setter dann zum Auffüllen des Eigenschaftswerts verwendet wird.
quelle