| 

.NET C# Java Javascript Exception

5
Mit dem Attribut Serializable lassen sich .NET-Klassen auch einfache Weise für eine Serialisierung vorbereiten, die dann mit der Methode Serialize vollzogen und mit Deserialise rückgängig gemacht werden kann. Als Vorgabe werden dabei allerdings immer alle Member einer Klasse serialisiert. Gibt es die Möglichkeit, in diesen Prozess einzugreifen und einzelne Member von der Serialisierung auszunehmen?
News:
08.12.2011
hfx642 51 2
3 Antworten
1
Ja. Schau dir das NonSerializedAttribute an.

Nachschlag:
Als Alternative solltest du dir noch den DataContractSerializer ansehen. Dort wird das über das "DataMember"-Attribut gesteuert.
Hier ist ein Vergleich der beiden mit weiterführenden Links: DataContractSerializer vs XmlSerializer: Pros and Cons of each serializer
08.12.2011
Jürgen Luhr 7,1k 1 9
Na fein, 13 Sekunden schneller! :) +1
Nicolai Schönberg 08.12.2011
Wieso muss mit dem Attribut eigendlich auf das lokale Feld und nicht auf dem Member ausgezeichnet werden?
Jorgen Schumann 08.12.2011
Wo steht das?
Jürgen Luhr 08.12.2011
Also falls du mit Member Property und das NonSerializedAttribute meinst: Das Attribut ist so implementiert => [AttributeUsageAttribute(AttributeTargets.Field)]
Nicolai Schönberg 08.12.2011
@Nicolai, genau das meine ich. Wieso verarbeitet der Serializer die internen Felder und nicht die Properties einer Klasse.
Jorgen Schumann 08.12.2011
http://stackoverflow.com/questions/3760879/why-doesnt-nonserialized-work-on-autoimplemented-properties/3760946#3760946
Jürgen Luhr 08.12.2011
Alles schön. Bis auf den letzten Link. Der XmlSerializer interessiert sich herzlich wenig für NonSerialized. Er hört stattdessen auf XmlIgnore. ISerializable, BinaryFormatter und SoapFormatter auf der einen Seite sowie IXmlSerializable und XmlSerializer auf der anderen Seite haben wenig miteinander zu tun und werden gern durcheinander gebracht.
Matthias Hlawatsch 08.12.2011
@Matthias: Uiuiui, blöde, dass man Kommentare nicht editieren kann. Da habe ich meinen Link selbst nur halbherzig durchgelesen.
Jürgen Luhr 08.12.2011
@Jorgen Tja gute Frage warum Microsoft es so implementiert hat das es nur auf Felder angewandt werden kann. Vll einfach deswegen weil man nicht immer für jedes Feld ein Property hat - Das Feld ist "die kleinere Einheit". Ansonsten würde mir kein Grund einfallen. Aber du könntest ein neues Attribute von der Klasse ableiten und das AttributeTargets auf Property ändern.
Nicolai Schönberg 09.12.2011
@Jürgen: Wirklich blöd, dass man Kommentare nicht editieren kann - sonst könnte ich "letzten Link" ändern in "letzten Link in Deiner Antwort", denn den hatte ich gemeint ;-)
@Nicolai: Jürgen hat in seinem 2. Kommentar einen Link zu SO gepostet. Die akzeptierte Antwort dort erklärt zumindest für mich recht schlüssig, warum MS es so gemacht hat. Was nicht heißt, dass es nicht auch anders geht - siehe XmlSerializer und DataContractSerializer.
Matthias Hlawatsch 09.12.2011
@Matthias Ah danke!
Nicolai Schönberg 09.12.2011
1
Moin

Auszug aus MSDN Codebeispiel:

// A test object that needs to be serialized.
[Serializable()]
public class TestSimpleObject {

public int member1;
public string member2;
public string member3;
public double member4;

// A field that is not serialized.
[NonSerialized()] public string member5;

public TestSimpleObject() {

member1 = 11;
member2 = "hello";
member3 = "hello";
member4 = 3.14159265;
member5 = "hello world!";
}


public void Print() {

Console.WriteLine("member1 = '{0}'", member1);
Console.WriteLine("member2 = '{0}'", member2);
Console.WriteLine("member3 = '{0}'", member3);
Console.WriteLine("member4 = '{0}'", member4);
Console.WriteLine("member5 = '{0}'", member5);
}
}


Mehr zu dem NonSerializedAttribute findest du hier

Grüße
08.12.2011
Nicolai Schönberg 2,4k 2 9
0
Der Vollständigkeit halber sei noch das ISerializable Interface erwähnt. Wenn Du das implementierst, kannst Du auch frei entscheiden, was de/serialisert wird.
09.12.2011
ffordermaier 8,4k 3 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH