Autor Beitrag
GerhardK
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 30.06.08 13:55 
Hallo erstmal in diesem Forum, ist ja meine erste Frage hier ;-)

Ich verwende den BinaryFormatter. Beim Deserialisieren wird aber der Default Konstruktor des serialsierten Objektes nicht aufgerufen. Warum nicht, wie wird denn das Objekt aufgerufen?

Im Moment habe ich mir mit dem [OnDeserialized] Handler geholfen. Ich würde aber gerne verstehen wie .net das Objekt anlegt.

Danke schon mal


Moderiert von user profile iconChristian S.: Topic aus IO, XML und Registry verschoben am Mo 30.06.2008 um 14:06
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 30.06.08 15:15 
:welcome: !

Zum Deserialisieren wird FormatterServices.Get(Safe)UninitializedObject benutzt (wie die Methode genau funktioniert, kannst du leider nicht nachschauen, da sie direkt in der CLR implementiert ist).
Zitat:
Because the new instance of the object is initialized to zero and no constructors are run, the object might not represent a state that is regarded as valid by that object. The current method should only be used for deserialization when the user intends to immediately populate all fields.
GerhardK Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 30.06.08 15:35 
Danke für die Antwort.
Aber da verstehe ich Microsoft nicht. Und ich dachte es wären die sauerein wie es unter Win32 und C/C++ nicht mehr möglich, man hat nun unter .Net ein saubere objekt orientierte Sprache. Aber beim meinem ersten Einsatz sehe ich schon wieder Tricksereien. Mir unverständlich wie man ein Objekt im Speicher anlegt, ohne den Konstruktor aufzurufen. Na ja was solls, wenn mans weiß kann man damit leben.
Danke nochmals
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 30.06.08 16:11 
user profile iconGerhardK hat folgendes geschrieben:
Aber beim meinem ersten Einsatz sehe ich schon wieder Tricksereien. Mir unverständlich wie man ein Objekt im Speicher anlegt, ohne den Konstruktor aufzurufen.
Es ist nicht so, dass es keine Alternativen gäbe - Activator.CreateInstance. Es war einfach eine grundlegende, implementationsunabhängige Entscheidung, dass Objekte von der Serialisierung nichts mitbekommen sollen, und ich kann es auch nachvollziehen. Es dürfte in den seltensten Sinn machen, Klassenfelder per Konstruktor zu initialisieren und sie danach sofort vom Formatter überschreiben zu lassen.
Aber vielleicht kannst du ja dein Ausgangsproblem einmal darstellen und mich womöglich sogar noch umstimmen ;) .
GerhardK Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mo 30.06.08 16:27 
Umstimmungsversuch: ;-)

Also das Objekt A das ich serialisiere hat einen Liste von Objekten B. Für diese Liste verwende ich BindingList<> da ich sie mit dem DataBinding an ein DataGridView binde.
Um das anlegen eines Objektes B (mittes DataGridView) zu erlauben und zu kontrollieren (ich muss bei jedem anlegen eine Art Index setzen) habe ich in dem Konstruktor von Klasse A einen AddingEventHanlder hinzugefügt. So in etwa:

_Bs.AddingNew += new AddingNewEventHandler(_Bs_AddingNew);

Und habe ich Überzeugen können, oder habe ich den TOTAL falschen Ansatz gewählt?
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 30.06.08 21:52 
Das liegt aber eher nicht an der Theorie des Serialisierens :zwinker: :
ausblenden C#-Quelltext
1:
2:
    [NonSerialized]
    private AddingNewEventHandler onAddingNew;

Das Attribut zeigt, dass das Event für den GUI-Code (der natürlich nicht mitserialisiert werden soll ;) ) gedacht ist und nicht für den Business Layer. Stattdessen könntest du von BindingList ableiten und InsertItem überschreiben, aber ehrlich gesagt stehe ich mit Winforms Data Binding sowieso auf dem Kriegsfuß :P .

Über die Intuitivität[meta]Das Wort gibt es nicht wirklich, oder *g* ?[/meta] des Ganzen könnte man sich streiten, aber mir fällt kein besseres System ein :nixweiss: . Wenn du vor der Serialisierung den Konstruktor aufrufen würdest, hättest du zwar den Eventhandler eingehakt, aber auf eine leere Liste, die sofort danach von der deserialisierten ersetzt würde.
GerhardK Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 01.07.08 07:56 
user profile iconKhabarakh hat folgendes geschrieben:
Wenn du vor der Serialisierung den Konstruktor aufrufen würdest, hättest du zwar den Eventhandler eingehakt, aber auf eine leere Liste, die sofort danach von der deserialisierten ersetzt würde.


Stimmt auch wieder.

Und danke nochmals für die ganzen Informationen.