Serialisierung von privaten Mitgliedsdaten
Ich versuche zu serialisieren eines Objekts in XML, der eine Anzahl von Eigenschaften, von denen einige sind schreibgeschützt.
public Guid Id { get; private set; }
Habe ich markiert die Klasse [Serializable] und implementierte ich die ISerializable-Schnittstelle.
Unten ist der code, den ich verwende, um mein Objekt serialisieren.
public void SaveMyObject(MyObject obj)
{
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
TextWriter tw = new StreamWriter(_location);
serializer.Serialize(tw, obj);
tw.Close();
}
Leider fällt es mehr auf die erste Zeile mit dieser Meldung.
InvalidOperationException wurde unbehandelt:
Nicht zum generieren einer temporären Klasse (Ergebnis=1).
Fehler CS0200: die Eigenschaft oder der indexer 'MyObject.Id' kann nicht zugewiesen werden -- Sie sind schreibgeschützt
Wenn ich die Id-Eigenschaft auf public funktioniert es einwandfrei. Kann mir jemand sagen, wenn ich mache etwas, oder zumindest dann, wenn es überhaupt möglich?
InformationsquelleAutor der Frage Jon Mitchell | 2009-04-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie
DataContractSerializer
(aber beachten Sie Sie nicht verwenden können, xml-Attribute - werden nur xml-Elemente):Alternativ können Sie implementieren
IXmlSerializable
und alles selbst machen - aber das funktioniert mitXmlSerializer
zumindest.InformationsquelleAutor der Antwort Marc Gravell
Könnten Sie die
System.Runtime.Serialization.NetDataContractSerializer
. Es ist stärker und behebt einige Probleme des klassischen Xml-Serializer.Beachten Sie, dass es gibt verschiedene Merkmale für diese ein.
Edit:
Update basierend auf Marc ' s Kommentar: Sie sollten wahrscheinlich verwenden Sie
System.Runtime.Serialization.DataContractSerializer
für Ihren Fall zu bekommen, ein sauberes XML. Der rest des Codes ist die gleiche.InformationsquelleAutor der Antwort Stefan Steinegger
Nur-lese-Felder werden nicht serialisiert werden, mit der
XmlSerializer
ist dies aufgrund der Natur derreadonly
StichwortAus der MSDN:
Also... würdest du ziemlich viel brauchen, um die Felder mit dem Wert in der default-Konstruktor...
InformationsquelleAutor der Antwort flalar
Ist nicht möglich mit einer bestimmten Serialisierung-Modus (siehe die anderen Kommentare, für workarounds). Wenn Sie wirklich wollen, zu verlassen, Ihre Serialisierung-Modus ist, müssen Sie arbeiten, um das framework Grenzen auf diesem. Sehen Sie diese Beispiel
Esentially, markieren Sie die Eigenschaft
public
, aber werfen eine Ausnahme, wenn es jederzeit zugegriffen andere als Deserialisierung.InformationsquelleAutor der Antwort jvenema