C # serialisiert private Klassenmitglieder
class Person
{
public string m_name;
private int m_age; //<< how do I serialize the darn little rat?
}
Einfache Frage, und doch scheint es wie ein großes Durcheinander, wenn Sie versuchen, Sie zu beantworten.
Jeder, schlage öffentliche getter/setter, aber meine app ist zu groß und machen einen getter/setter für jedes Mitglied würde nur dazu führen, Wartbarkeit Probleme.
Bin ich gezwungen, erstellen Sie eine benutzerdefinierte Serialisierung hier oder ist es ein Magie-Attribut für solche Mitglieder?
Wie kann ich serialisieren Klassenelemente?
Edit #1:
Ok, alle, sorry für die Unklarheiten, ich war ein bisschen aufgeregt, wenn ich schrieb diese Frage, es war mehrere Stunden nach dem Versuch, um die Lösung zu finden.
Sowieso, hier sind weitere Fakten:
1. Ich versuche, die XML-Serialisierung dieser Klasse. Derzeit bin ich mit System.Xml.Serialization.XmlSerializer
.
2. Ich bin serialisieren in XML zu haben, die version die Kompatibilität, die soweit ich das verstanden habe binary nicht bieten mir das.
3.Ich hatte gehofft, dass es eine gewisse Attribut wie:
class Person
{
public string m_name;
[SerializeThat(ElementName="Age")]
private int m_age; //<< how do I serialize the darn little rat?
}
ODER (Fortsetzung von fact #3) eine Attribut, das geht über die Klasse die würde wie folgt Aussehen:
[Serializable(DoPrivate = true, DoProtected = true)]
class Person
{
public string m_name;
private int m_age; //<< how do I serialize the darn little rat?
}
Nun, was kann ich tun um es zu erreichen?
InformationsquelleAutor der Frage Poni | 2010-11-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Geht die Annahme ein Tippfehler, ich möchte Sie umleiten dieser Artikel SO, wo die Lösung ist die Verwendung eines
DataContractSerializer
statt.InformationsquelleAutor der Antwort Brad Christie
Wenn Sie
BinaryFormatter
wird, wird Sie für Ihre Klasse " private parts.Markieren Sie jede Klasse von dir mit [Serializable], oder Sie werden nicht weit gehen...
Sehen Sie sich auch diese: Warum ist das Serializable-Attribut für ein Objekt serialisiert werden
Da braucht man XML, vielleicht kannst du selbst ziehen, obwohl es alle mit
SoapFormatter
. Sehendiese.
Apropos-version Kompatibilität: ich benutze
BinaryFormatter
und habe keine Probleme mit der schema-upgrades. Versuchen Sie es bitte: Sie behandeln können änderungen am schema selbst, unsere einfach ersetzen null-Zeiger Links von derDeserialize
mit entsprechenden Standard-Konstrukte. Wenn Sie wirklich nicht brauchen die Funktionen, die XML bieten, gehen binäre - Sie werden nie wieder sehen.Außerdem eine weitere ÄNDERUNG:
BF leicht zu lösen alle Ihre mehrfachen Verweise, damit es nicht zu schaffen, mehrere Instanzen der gleichen Referenz über und über. Denke, dass Sie Sie nicht bekommen, dass mit
XmlSerializer
- es ist offensichtlich, dass es keinen Platz für die Speicherung dieser Informationen.Beispiel:
Versuchen serialisieren/Deserialisieren
md
mit mehreren alternativen...InformationsquelleAutor der Antwort Daniel Mošmondor
Weiß nicht, ob Sie verwenden können,
DataContract
. Aber mit diesem konnte Sie schreiben:Den Vorteil, DataContract, die Sie serialisieren können private Felder und Ihre Klasse nicht brauchen einen Standard-Konstruktor.
InformationsquelleAutor der Antwort Oliver
Was serializer aß Sie derzeit verwenden? Fast alle arbeiten sollten mit. Aber die öffentlichen Felder *ist*eine schlechte Idee. XmlSerializer und JavaScriptSerializer ignorieren private Mitglieder. DataContractSerializer und protobuf-net kann Umgang mit privaten Mitgliedern. BinaryFormatter Griffe Felder (öffentlich oder privat), aber ist keine gute Idee IMO für eine Vielzahl von Gründen.
InformationsquelleAutor der Antwort Marc Gravell
ISerializable? http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx
InformationsquelleAutor der Antwort Master Morality
Du besser schreiben benutzerdefinierte serializer
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx
InformationsquelleAutor der Antwort Sid C