Ich versuche, ein Objekt in XML zu serialisieren, das eine Reihe von Eigenschaften aufweist, von denen einige schreibgeschützt sind.
public Guid Id { get; private set; }
Ich habe die Klasse [Serializable] markiert und die ISerializable-Schnittstelle implementiert.
Unten ist der Code, mit dem ich mein Objekt serialisiere.
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 in der ersten Zeile mit dieser Nachricht um.
InvalidOperationException wurde nicht behandelt: Es konnte keine temporäre Klasse generiert werden (Ergebnis = 1). Fehler CS0200: Eigenschaft oder Indexer 'MyObject.Id' kann nicht zugewiesen werden - es ist schreibgeschützt
Wenn ich die Id-Eigenschaft auf public setze, funktioniert sie einwandfrei. Kann mir jemand sagen, ob ich etwas mache oder ob es überhaupt möglich ist?
quelle
Sie könnten die verwenden
System.Runtime.Serialization.NetDataContractSerializer
. Es ist leistungsfähiger und behebt einige Probleme des klassischen Xml Serializer.Beachten Sie, dass es für dieses Attribut unterschiedliche Attribute gibt.
[DataContract] public class X { [DataMember] public Guid Id { get; private set; } } NetDataContractSerializer serializer = new NetDataContractSerializer(); TextWriter tw = new StreamWriter(_location); serializer.Serialize(tw, obj);
Bearbeiten:
Update basierend auf Marc's Kommentar: Sie sollten es wahrscheinlich
System.Runtime.Serialization.DataContractSerializer
für Ihren Fall verwenden, um ein sauberes XML zu erhalten. Der Rest des Codes ist der gleiche.quelle
Schreibgeschützte Felder werden nicht mit dem serialisiert
XmlSerializer
. Dies liegt an der Art desreadonly
SchlüsselwortsVon MSDN:
Also ... Sie müssten so ziemlich den Feldwert im Standardkonstruktor festlegen ...
quelle
Mit diesem speziellen Serialisierungsmodus ist dies nicht möglich (Problemumgehungen finden Sie in den anderen Kommentaren). Wenn Sie Ihren Serialisierungsmodus wirklich unverändert lassen möchten, müssen Sie die Framework-Einschränkungen in diesem Fall umgehen. Siehe dieses Beispiel
Markieren Sie die Eigenschaft im Wesentlichen, lösen Sie
public
jedoch eine Ausnahme aus, wenn zu einem anderen Zeitpunkt als der Deserialisierung darauf zugegriffen wird.quelle
System.Diagnostics.StackTrace
herausfinden, wie Ihre Immobilie heißt, aber ich würde eine solche Lösung nicht empfehlen :-)