2016-06-10 6 views
0

Mit Klasse namens PanelGroup und es hat die Eigenschaft ElementControl, dessen Typ namens Kontrolle. Wie ich weiß Control ist nicht serialisierbar, was ist dann empfohlen, diese Klasse serialisieren zu lassen? Vielen Dank.C# -Klasse Serialisierung mit Eigenschaft basierend auf Steuer

public class PanelGroup 
{ 
    public PanelGroup(FormElementGroupBase parentElement) : base(parentElement) 
    { 
     Intialize(); 
    } 

    public PanelGroup(FormElementGroupBase parentElement, int id, string name, bool isVertical) : base(parentElement, id, name) 
    { 
     Intialize(); 
     IsVertical = isVertical; 
    } 

    private void Intialize() 
    { 
     this.ItemType = DomainItemTypes.PANEL_GROUP; 
     this.ElementControl = new PanelControl(); 
     this.ElementControl.MinimumSize = new Size(50, 50); 
     (this.ElementControl as PanelControl).AutoSize = true; 
     (this.ElementControl as PanelControl).AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; 

     if (ParentElement != null) 
     { 
      ParentElement.ElementControl.Controls.Add(this.ElementControl); 
     }; 

     this.ElementControl.AllowDrop = true; 
     this.ElementControl.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Control_OnMouseUp); 
     this.ElementControl.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Control_OnMouseDown); 
     this.ElementControl.KeyDown += new KeyEventHandler(this.Control_OnKeyDown); 
     this.ElementControl.DragDrop += new DragEventHandler(OnDragDrop); 
     this.ElementControl.DragOver += new DragEventHandler(OnDragOver); 
    } 

    [Browsable(false)] 
    public override string NamePrefix 
    { 
     get { return "PanelGroup"; } 

    } 

    internal sealed override void Highlight() 
    { 
     (this.ElementControl as PanelControl).Appearance.BorderColor = SelectionColor; 
    } 
} 
+0

Was ist Ihr erwartetes Ergebnis? Wenn Sie ein PanelGroup-Objekt serialisieren und deserialisieren, erwarten Sie, dass ElementControl null ist? Oder erwarten Sie, dass es mit allen relevanten Eigenschaften ausgefüllt wird, die dem Wert vor der Serialisierung entsprechen? –

Antwort

0

Sie haben ein paar Optionen. Am einfachsten ist es, ein [NonSerialized] -Attribut auf Ihre ElementControl-Eigenschaft zu setzen, was bedeutet, dass es beim Serialisieren Ihrer PanelGroup übersprungen wird. Das führt dazu, dass Sie den Wert von ElementControl verlieren, wenn Sie die Eigenschaft deserialisieren und reserialisieren.

Eine weitere Option ist das Objekt manuell serialisiert werden (siehe here), aber dies eine Menge Arbeit nehmen.

Die beste Option, wie immer, wenn Sie in diese Art von Problem laufen, ist es weg, Refactoring. Es gibt wirklich keinen Grund dafür, dass eine Nicht-Kontrollklasse jemals eine Instanz einer Kontrollklasse enthält. Ihr Domänencode (dh benutzerdefinierte Klassen, die Sie erstellen, um echte Konzepte darzustellen) sollte von Ihrer Benutzeroberfläche getrennt sein. Möglicherweise müssen Sie Eigenschaften haben, die alle Daten repräsentieren, die für die spätere Neuerstellung des Steuerelements erforderlich sind. Dies ist jedoch ohne Abhängigkeiten von UI-spezifischen Implementierungsdetails wie der Control-Klasse möglich.

+0

Wenn ich es Refactoring weg, wie Sie sagen, dann muss ich ein anderes Objektmodell beibehalten, um zu UI-Events wie „OnDragDrop“, „OnDragOver“ etc und es gibt zu verwalten müssen Beziehung zwischen dieser Steuer Sammlung und Object (PanelGroup etc) Sammlung sein . – Tim

+0

Das ist richtig - Sie hätten ein separates Modell, das für die UI-Logik zuständig ist, während diese Klasse die Domänen- oder Geschäftslogik repräsentiert. Es mag einige Beziehungen zwischen ihnen geben, aber die Trennung ist insgesamt noch besser. Werfen Sie einen Blick auf MVP, MVC, MVVM-Muster für einige Beispiele des gleichen Stammkonzepts. –