[VB.NET] Interface ISerializable

c4rr3r4 Messages postés 16 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 4 juin 2012 - 7 févr. 2011 à 17:09
c4rr3r4 Messages postés 16 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 4 juin 2012 - 7 févr. 2011 à 19:21
Bonjour,
je rencontre un petit soucis avec l'interface Iserialisable.
Je voudrais enregistrer (sérialiser) dans un fichier binaire tous les objets contenus dans un panel. Ces objets sont des boutons on/off qui héritent de checkbox. Les checkbox n'étant pas sérializable, j'implémente donc ma classe avec Iserializable comme ceci (c'est le code expliqué sur msdn) :


Imports System.Runtime.Serialization
Imports System.Security.Permissions
 
<Serializable()>
Public Class CommandeONOFF
    Inherits CheckBox
    Implements ISerializable
 
    ' This is the one instance of this type.
    Private Shared ReadOnly theOneObject As New CommandeONOFF
 
#Region "Propriétés"
    Public Property NumAutomate As String
    Public Property bitN As String
#End Region
 
    ' Private constructor allowing this type to construct the CommandeONOFF.
    Public Sub New()
        Appearance = Appearance.Button
    End Sub
 
    ' A method called when serializing a CommandeONOFF.
    <SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags:=SecurityPermissionFlag.SerializationFormatter)> _
    Public Sub GetObjectData(ByVal info As System.Runtime.Serialization.SerializationInfo, ByVal context As System.Runtime.Serialization.StreamingContext) Implements System.Runtime.Serialization.ISerializable.GetObjectData
        ' Instead of serializing this object, we will  serialize a CommandeONOFFSerializationHelper instead.
        info.SetType(GetType(CommandeONOFFSerializationHelper))
    End Sub
 
    ' A method returning a reference to the CommandeONOFF.
    Public Shared Function GetCommandeONOFF() As CommandeONOFF
        Return theOneObject
    End Function
 
End Class
 
<Serializable()> Friend NotInheritable Class CommandeONOFFSerializationHelper
    Implements IObjectReference
    ' This object has no fields (although it could).
 
    ' GetRealObject is called after this object is deserialized.
    Public Function GetRealObject(ByVal context As StreamingContext) As Object Implements IObjectReference.GetRealObject
        ' When deserializing this object, return a reference to the Singleton object instead.
        Return CommandeONOFF.GetCommandeONOFF()
    End Function
End Class


Donc mes objets se sérializent bien quand je lance ma méthode de sérialization sur ma collection d'objets, et ils se désérializent bien mais ils ne conservent pas leur propriétés, donc la sérialization ne me sert à rien ...

Par exemple, je peux déplacer mes objets avec la souris, quand je les sérialize j'aimerai pouvoir conserver la propriété .location de l'objet, comme ça une fois désérializé il retrouve sa position dans mon panel.
Mais une fois dézérializé, mon objet a perdu toutes ses propriétés (position, couleur, taille ...), c'est un checkbox pas défaut !


J'ai trouvé une solution mais elle ne me plait pas, je voudrais que ça soit plus dynamique et moins static, pour la solution dès que je rajoute un objet dans mon panel, je l'ajoute à une collection colObjet, j'ajoute sa dernière abscisse connue dans une collection colX et sa dernière ordonnée connue dans une collection colY, puis je crée une "listCol as list(of collection)".
Je sérialize cette liste et je traite chaque objet déserializé en lui affectant sa dernière abscisse et sa dernière ordonnée en parcourant les collections, mais c'est pas génial. Si je dois faire ça avec toutes les propriétés que je veux garder je ne suis pas sorti de l'auberge.


Je voudrais pouvoir sérialiser tous les objets (il n'y aura pas que des commandeONOFF héritant de checkbox mais pas mal d'autres objets héritant de diverses controls de vb.net) contenus dans mon panel en utilisant la collection "panel.controls".

Si quelqu'un à compris et peut me répondre je l'en remercie, sinon je peux donner plus de détails.

2 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
7 févr. 2011 à 18:55
Salut

regardes le code suivant
apres adaptation, il repondra peut etre au probleme

XmlDocument doc;

function SaveForm()
{
   doc = new XmlDocument("FormInfo");
   foreach(Control ctrl in this.Controls)
   {
      AddControlToXml(ctrl, doc.Documentelement);
   }
}

function AddControlToXml(Control ctrl, XmlNode currentNode)
{
   XmlNode n = new XmlNode;
   Node.InnerText = ctrl.Name;
   foreach(Control ctrl2 in ctrl.Controls)
   {
      AddControlToXml(ctrl2);
   }

}

0
c4rr3r4 Messages postés 16 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 4 juin 2012
7 févr. 2011 à 19:21
J'ai oublié de préciser mais ça doit rester en sérialisation binaire pas de sérialisation XML.
0
Rejoignez-nous