Laden...

Fail to create component / Not marked as serializable

Letzter Beitrag vor 17 Jahren 21 Posts 4.710 Views
Fail to create component / Not marked as serializable

Ich hab eine Komponente, an der ich rum baue, nun hab ich eine abstrakte Klasse hinzugefügt, die herbivore hier im Forum im zusammenhang mit beweglichen grafiken gepostet hat, dort gibt es auch eine konkrete implementation der klasse, nur tritt auf einmal, wenn ich meine Komponenten in eine Form dragge, die Meldung da unten auf.
Kann mir das einer erklären? Ich hab in der assembly nichts getan, noch hab ich was mit der serialisierung vorgehabt, aber auf einmal meckert er.
Ich habe nie von dem Teil verlangt, irgendwas richtung serialisierung zu tun oder nicht zu tun

Life is a short

Hallo Seikilos,

den Artikel über das Bewegen von Grafik-Objekten ist von progger. Ich will mich nicht mit fremden Federn schmücken.

Ansonsten steht doch genau da, was Sache ist. Eine Objekt soll serialisiert werden, obwohl seine Klasse nicht serialsierbar ist. Also entweder du serialsierst nicht oder du machst die Klasse serialsierbar.

herbivore

Ja aber ich serialisiere doch nicht.
Hab nichts damit am hut, nirgends Serializable Marker oder sowas.
Und keine Ahnung woher das kommt

Life is a short

Hallo Seikilos,

guck dir mal den gesamten StackTrace der Exception an (am besten die Anwendung im Debug-Modus übersetzen). Da sollte dann die Stelle deines Codes stehen, an dem die Aktion ausgelöst wird.

Serialisierung wird ja nicht nur explizit benutzt, sondern auch implizit bei Remoting und anderem.

herbivore

Ja aber das kann nicht sein, ich habe dieses clrObject aus allem gelöscht, dennoch kommt der Fehler.
Es gibt kein Remote, kein garnichts, dass ist im Moment nur eine simple Komponente, kein stück mit serialize oder network.
Und wieso kommt der Fehler, obwohl das Object nicht mehr da ist

Life is a short

Hatte bei nem UserControl auch mal das Problem, nachdem ich es als [Serializable] markiert hatte, danach wieder entfernt hatte ging es, keine Ahnung wieso.

Hatte ich schon, vor allem ist es verwunderlich, da die Assembly schon vorher da war und später erst das MyColor ding

Life is a short

Ehm, ich beiß mir in den Hintern, was soll dass nur.

Siehe Screen, ich habe das MyColorObject umbenannt und die Verweise nicht upgedated, siehe screen halt, Projekt Rebuild, aber er erkennt die Klasse immernoch und meckert immernoch wegen irgendwelchem Serialize zeug...

Eh, edit, na klar, die Klasse hieß noch so, aber kann mir keiner helfen?
Ich hab die mycolorobject nachträglich in ein UserControl Projekt hinzugefügt, was kann denn da diese Fehler erzeugen?
Es liegt wohl kaum an den virtuellen methoden, oder?

Der Fehler wird duch

clrObjects = new List<MyColorObject>();

erzeugt, aber warum? Ich meine, was ist daran so falsch?
An abstract liegts wohl nicht, aber warum kann ich diese klasse nicht initiasieren?

Life is a short

Ehm, ich komme der Spur langsam näher, verstehe aber nicht, was das Problem ist.
Auftauchen tut die Zeile, wenn ich folgendes habe


private List<MyColorObject> myClrObjects
public List<MyColorObject> clrObjects
        {
            get { return myClrObjects; }
            set { myClrObjects = value; }
        }
//Und später irgendwo
clrObjects = new List<MyColorObject>();

Was soll das heißen? Das List nur serialisierbare Objekte nimmt, oder wie darf ich das verstehen?

Ich hab in einem anderen Projekt auch eine List<Lied> wo lied eine eigene Klasse ist, aber sie ist nicht abstract, noch kommt diese Serialize Meldung.

Edit: Sehr verwirrend, lasse ich die Public Methode weg, so kommt diese serialize Meldung nicht, ist die Methode da, so wirft diese, auch ohne genutzt zu werden, diesen serialize error.
Es passiert auch nur in einem Projekt, wo ich ein UserControl zu einer Form1 TestForm hinzufügen will, dann bekomme ich immer diesen Code Generation Error

Life is a short

Hallo Seikilos,

ich gehe davon aus, dass der Designer die Liste, und damit Objekte des Typs 'MyColorObject' serialisieren will.
Willst du das nicht, musst du ein Attribute setzten. Versuch mal:


[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public List<MyColorObject> clrObjects
{
   get { return myClrObjects; }
   set { myClrObjects = value; }
}

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

Oh ha!
Das funktioniert.

Herzlichen Dank!

Aber auf sowas wäre ich ja niemals gekommen.
Was heißt das überhaupt, warum will der Designer mein Objekt serializieren?
Und sind sonst Strings und alles andere, was in eine List kkommt und im Designer dargestellt ist prinzipiell Serializable? Wenn ja, sollte ich das auch probieren, oder gibt das keine Vorteile? Ich hab nämlich nicht vor die Liste oder den Typ in dem Fall zu serialisieren

Life is a short

Hallo Seikilos,

ob eine Klasse Serializable ist, steht in der Doku.

herbivore

Ja, ich erinnere mich an die Beschreibung, da stand oft Serializable, aber warum will der Designer auf einmal bei der User Control das Ding serialisieren und wenn es normal in einer Form vorkommt nicht?

Life is a short

Hallo Seikilos,

Original von Seikilos
Was heißt das überhaupt, warum will der Designer mein Objekt serializieren?

Prinzipiell werden alle Einstellungen für Objekte, also der Zustand, vom Designer in einer XML-Datei gespeichert. Nichts anderes ist eine .resx-Datei, wenn du dir die mal im Code anschaust. Also muss eine eigene Komponete, welche mit dem Designer genutzt werden soll serialisierbar sein, oder aber eine Eigenschaft, hier 'clrObjects', muss ausgeschlossen werden, wenn diese nicht für die Reproduzierbarkeit des Objektes nötig ist.

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

Das bedeutet als alternative,[Serializable] rein und von Soap die Methoden überschreiben?

Life is a short

Ganz so einfach ist das nicht. Das Attribute [Serializable] ist nur der Anfang. Es gibt Dinge die lassen sich nicht ohne weiteres serialisieren, z.B. Hashtable, usw. Aber das hier in aller Ausführlichkeit zu diskutieren wird schwierig; ist von Fall zu Fall auch viel zu unterschiedlich.

//edit: und überschreiben brauchst du eigentlich nichts, ausser du schreibst dir einen eigenen Serializer.

Gruss
Friedel

Ohne Ziel ist auch der Weg egal.

Ehm, ja ich weiß, was die Probleme beim Serializieren im allgemein sind.
Aber super, das hilft mir im Moment wesendlich weiter.

Danke

Life is a short

OMG, was ist mit dieser IDE los?

Ich dragge die Komponente in die Form und bekomme eine Message Box mit "Paramter not valid", keine Exception,nichts beim Kompilieren, keine Message oder Warning, garnichts, nur diese Meldung!
Wie bitte soll man so arbeiten? Was soll das für ne Fehlermeldung sein, da hilft mir die Speicheradresse, wo das passiert ist ja mehr.

Kann mir da einer zu was sagen?

Edit, mit Bildanhang, Komponente gelöscht und wieder reingedragt und das ist der Grund!
Das ist ein Scherz? Hab ich die Mindestanzahl der Elemente in der Liste unterschritten?
Und ich hab auch versucht alles zu ReBuilden, aber siehe Bild.
Ich hab nicht zufällig einen Bug gefunden?

Life is a short

Hallo Seikilos,

ich kann nun nichts konkret zu Deinem Problem sagen, aber wenn Du solche Designer-Schwierigkeiten hast, dann kann ich Dir folgenden Tipp geben:

Debugge den Designer!

Und ja, das geht, und zwar folgendermaßen:

  • Gehe in Deinen Solution Explorer
  • Rechts-Klicke Dein Startup-Project und klicke Eigenschaften
  • Wähle dort die Auswahl "Debug"
  • Ändere dort die Einstellung "Start Project" in "Start External Program"
  • Wähle für das externe Programm die MS-VisualStudio IDE
    (bei mir: "D:\Programme\Microsoft Visual Studio 8\Common7\IDE\devenv.exe")
  • Ergänze in CommandLine Arguments so, dass der IDE gleich deine Solution mit komplettem Pfad angegeben wird (z.B. D:\Projects\MyProject\MyProject.sln")
  • Drücke auf "alle Dateien Speichern"

Und dann debugge das Ganze mal. Du wirst sehen, dass ein 2. VS aufgeht, und automatisch Deine Solution geladen wird. Wenn Du jetzt in Deinem 1. VS die Breakpoints setzt (z.B. im Konstruktor Deines Controls), dann kannst Du im 2. VS Dein Control auf eine Form ziehen, und der Debugger bleibt an jedem Breakpoint stehen. Dann siehst Du erst einmal, wo die Probleme sind, und zweitens kannst Du jederzeit nachvollziehen, was der Designer aktuell macht.

Gruß
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

Teste ich, danke.
Aber wie ich oben gepostet habe, liegt das Problem wirklich an dieser einen Zeile
und ich hab nicht die geringste Ahnung, wieso

Life is a short

Ehm das Problem taucht nicht beim Starten auf, sondern wenn ich meine Komponente in die Form schiebe.
Und es liegt oben an der Zeile

Life is a short