Accueil > > > SAUVEGARDE/CHARGEMENT DE PROPRIÉTÉS D'UN OBJET
SAUVEGARDE/CHARGEMENT DE PROPRIÉTÉS D'UN OBJET
Information sur la source
Description
Ceci est un petit composant permettant de sauvegarder/charger les propriétés de n'importe quel objet. Les-dites propriétés sont stockées dans un fichier de sérialisation zippé. Les thèmes abordés pour ce code sont principallement la sérialisation, le zippage de fichier avec la librairie SharpZipLib, un peu de flux, la récupération de la liste des nom des propriétés d'un objet ainsi que les valeurs associées à ces propriétés, et l'assignation de valeurs à des propriétés en fonction de leur nom.
Ce code a été compilé avec le Framework SDK 1.1, et à l'aide de l'excélent SharpDevelop. Vous trouverez dans le zip le composant en lui même, ainsi qu'un exécutable de tests.
Tiens mais au fait, à quoi tout celà peut-il bien servir ? Et bien la sauvegarde de propriétés est bien pratique par exemple pour qu'une fenêtre soit replacée au même endroit que lorsqu'elle a été fermée. Si l'utilisateur a laissé la fenêtre en grand avant de quitter, et ien la fenêtre sera de nouveau grande au prochain lancement du prog. Mais bien sûr, tout ceci s'applique aux forms, mais aussi à n'importe quel type d'objet.
Il est à noter que seules les propriétés accessibles en lecture et en écriture, et sérialisables sont sauvegardées.
Source
- /*
- * Created by SharpDevelop.
- * User: Yo
- * Date: 03/12/2004
- * Time: 22:51
- *
- * To change this template use Tools | Options | Coding | Edit Standard Headers.
- */
- using System;
- using System.Drawing;
- using System.Windows.Forms;
- using System.ComponentModel;
- using System.Reflection;
- using System.Collections;
- using System.IO;
- using System.Runtime.Serialization.Formatters.Binary;
- using System.Runtime.Serialization;
- using ICSharpCode.SharpZipLib.Zip;
-
- namespace PropertiesKeeperNS{
- /// <summary>
- /// Permet de stocker et restaurer les propriétés d'un objet, quel qu'il soit. Les propriétés
- /// chargées et sauvegardées doivent être accessibles en lecture/écriture, et doivent être
- /// sérialisables.
- /// </summary>
- public class PropertiesKeeper : System.Windows.Forms.Control{
- private PropertyAndValueList PropertySaver = new PropertyAndValueList();
-
- private Control m_Ctrl = null;
- public Control Ctrl{
- set{m_Ctrl = value;}
- get{return m_Ctrl;}
- }
-
- public PropertiesKeeper(){
-
- }
-
- /// <summary>
- /// Permet de charger le fichier de configuration.
- /// </summary>
- /// <param name="FileName">Le nom du fichier à charger.</param>
- public void Load(string FileName){
- if(m_Ctrl == null) return;
-
- ZipInputStream zip = new ZipInputStream(new FileStream(FileName,FileMode.Open,FileAccess.Read));
- ZipEntry zip_entry;
- while((zip_entry = zip.GetNextEntry())!=null){
- try{
- if(zip_entry.Name == "conf"){
- MemoryStream stream = new MemoryStream();
- int count;
- byte[] mem= new byte[10000];
- //l'écriture
- while ((count = zip.Read(mem, 0, 10000)) > 0){
- stream.Write(mem, 0, count);
- }
- stream.Seek(0, SeekOrigin.Begin);
- LoadConfigFromStream(stream);
- }
- }catch(Exception e){
- Console.WriteLine(e.Message);
- }
- }
- zip.Close();
- }
-
- /// <summary>
- /// Permet de charger la config depuis un flux.
- /// </summary>
- /// <param name="stream">Le flux en question.</param>
- private void LoadConfigFromStream(Stream stream){
- IFormatter formatter = new BinaryFormatter();
- PropertySaver = (PropertyAndValueList) formatter.Deserialize(stream);
- ApplyProperties();
- }
-
- /// <summary>
- /// Permet d'appliquer les différentes propriétés à l'objet
- /// </summary>
- private void ApplyProperties(){
- PropertyInfo []properties = m_Ctrl.GetType().GetProperties(BindingFlags.Public|BindingFlags.Instance);
-
- foreach(PropertyInfo p in properties){
- if(p.CanRead && p.CanWrite){
- Object val = p.GetValue(m_Ctrl, null);
-
- if(val != null){
- if(p.PropertyType.IsSerializable){
- PropertyAndValue prop = PropertySaver.GetPropertyAndValue(p.Name);
- if(prop != null){
- p.SetValue(m_Ctrl, prop.PropertyValue, null);
- }
- }
- }
- }
- }
- }
-
- /// <summary>
- /// Sauvegarde les différentes propriétés de l'objet, pour peu quelles soient
- /// accessibles en lecture et en écriture, et sérialisable.
- /// Le fichier de sérialisation est aussi zippé.
- /// </summary>
- public void Save(string FileName){
- if(m_Ctrl == null) return;
-
- PropertySaver.Clear();
-
- // Récupération des propriétés accessibles en lecture/ecriture, et qui sont sérialisables.
-
- PropertyInfo []properties = m_Ctrl.GetType().GetProperties(BindingFlags.Public|BindingFlags.Instance);
-
- foreach(PropertyInfo p in properties){
- if(p.CanRead && p.CanWrite){
- Object val = p.GetValue(m_Ctrl, null);
-
- if(val != null){
- if(p.PropertyType.IsSerializable){
- PropertySaver.Add(new PropertyAndValue(p.Name, val));
- }
- }
- }
- }
-
- // Sauvegarde des propriétés
- MemoryStream myStream = new System.IO.MemoryStream();
- IFormatter formatter = new BinaryFormatter();
- formatter.Serialize(myStream, PropertySaver);
-
- // Création d'un fichier zip contenant les propriétés
- ZipEntry MyZipEntry = new ZipEntry("conf");
- ZipOutputStream MyZipOutputStream = new ZipOutputStream((File.Create(FileName)));
- MyZipOutputStream.PutNextEntry(MyZipEntry);
- byte[] buffer = new byte[4096];
- myStream.Seek(0, SeekOrigin.Begin);
- int count = myStream.Read(buffer, 0, 4096);
- while (count > 0){
- MyZipOutputStream.Write(buffer, 0, count);
- count = myStream.Read(buffer, 0, 4096);
- }
- myStream.Close();
- MyZipOutputStream.Close();
- }
- }
-
- [Serializable]
- public class PropertyAndValue{
- /// <summary>
- /// Classe permettant de stocker une propriété avec son nom et sa valeur.
- /// </summary>
- private string m_PropertyName = String.Empty;
- public string PropertyName{
- set{m_PropertyName = value;}
- get{return m_PropertyName;}
- }
-
- private Object m_PropertyValue = null;
- public Object PropertyValue{
- set{m_PropertyValue = value;}
- get{return m_PropertyValue;}
- }
-
- public PropertyAndValue(string PropertyName, Object PropertyValue){
- m_PropertyName = PropertyName;
- m_PropertyValue = PropertyValue;
- }
- }
-
- [Serializable]
- public class PropertyAndValueList : CollectionBase{
- /// <summary>
- /// Classe permettant de stocker plusieurs propriétés.
- /// </summary>
- public void Add(PropertyAndValue p){
- List.Add(p);
- }
-
- public PropertyAndValue GetPropertyAndValue(string propertyName){
- foreach(PropertyAndValue p in List){
- if(p.PropertyName == propertyName){
- return p;
- }
- }
- return null;
- }
- }
- }
/*
* Created by SharpDevelop.
* User: Yo
* Date: 03/12/2004
* Time: 22:51
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using System.Reflection;
using System.Collections;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using ICSharpCode.SharpZipLib.Zip;
namespace PropertiesKeeperNS{
/// <summary>
/// Permet de stocker et restaurer les propriétés d'un objet, quel qu'il soit. Les propriétés
/// chargées et sauvegardées doivent être accessibles en lecture/écriture, et doivent être
/// sérialisables.
/// </summary>
public class PropertiesKeeper : System.Windows.Forms.Control{
private PropertyAndValueList PropertySaver = new PropertyAndValueList();
private Control m_Ctrl = null;
public Control Ctrl{
set{m_Ctrl = value;}
get{return m_Ctrl;}
}
public PropertiesKeeper(){
}
/// <summary>
/// Permet de charger le fichier de configuration.
/// </summary>
/// <param name="FileName">Le nom du fichier à charger.</param>
public void Load(string FileName){
if(m_Ctrl == null) return;
ZipInputStream zip = new ZipInputStream(new FileStream(FileName,FileMode.Open,FileAccess.Read));
ZipEntry zip_entry;
while((zip_entry = zip.GetNextEntry())!=null){
try{
if(zip_entry.Name == "conf"){
MemoryStream stream = new MemoryStream();
int count;
byte[] mem= new byte[10000];
//l'écriture
while ((count = zip.Read(mem, 0, 10000)) > 0){
stream.Write(mem, 0, count);
}
stream.Seek(0, SeekOrigin.Begin);
LoadConfigFromStream(stream);
}
}catch(Exception e){
Console.WriteLine(e.Message);
}
}
zip.Close();
}
/// <summary>
/// Permet de charger la config depuis un flux.
/// </summary>
/// <param name="stream">Le flux en question.</param>
private void LoadConfigFromStream(Stream stream){
IFormatter formatter = new BinaryFormatter();
PropertySaver = (PropertyAndValueList) formatter.Deserialize(stream);
ApplyProperties();
}
/// <summary>
/// Permet d'appliquer les différentes propriétés à l'objet
/// </summary>
private void ApplyProperties(){
PropertyInfo []properties = m_Ctrl.GetType().GetProperties(BindingFlags.Public|BindingFlags.Instance);
foreach(PropertyInfo p in properties){
if(p.CanRead && p.CanWrite){
Object val = p.GetValue(m_Ctrl, null);
if(val != null){
if(p.PropertyType.IsSerializable){
PropertyAndValue prop = PropertySaver.GetPropertyAndValue(p.Name);
if(prop != null){
p.SetValue(m_Ctrl, prop.PropertyValue, null);
}
}
}
}
}
}
/// <summary>
/// Sauvegarde les différentes propriétés de l'objet, pour peu quelles soient
/// accessibles en lecture et en écriture, et sérialisable.
/// Le fichier de sérialisation est aussi zippé.
/// </summary>
public void Save(string FileName){
if(m_Ctrl == null) return;
PropertySaver.Clear();
// Récupération des propriétés accessibles en lecture/ecriture, et qui sont sérialisables.
PropertyInfo []properties = m_Ctrl.GetType().GetProperties(BindingFlags.Public|BindingFlags.Instance);
foreach(PropertyInfo p in properties){
if(p.CanRead && p.CanWrite){
Object val = p.GetValue(m_Ctrl, null);
if(val != null){
if(p.PropertyType.IsSerializable){
PropertySaver.Add(new PropertyAndValue(p.Name, val));
}
}
}
}
// Sauvegarde des propriétés
MemoryStream myStream = new System.IO.MemoryStream();
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(myStream, PropertySaver);
// Création d'un fichier zip contenant les propriétés
ZipEntry MyZipEntry = new ZipEntry("conf");
ZipOutputStream MyZipOutputStream = new ZipOutputStream((File.Create(FileName)));
MyZipOutputStream.PutNextEntry(MyZipEntry);
byte[] buffer = new byte[4096];
myStream.Seek(0, SeekOrigin.Begin);
int count = myStream.Read(buffer, 0, 4096);
while (count > 0){
MyZipOutputStream.Write(buffer, 0, count);
count = myStream.Read(buffer, 0, 4096);
}
myStream.Close();
MyZipOutputStream.Close();
}
}
[Serializable]
public class PropertyAndValue{
/// <summary>
/// Classe permettant de stocker une propriété avec son nom et sa valeur.
/// </summary>
private string m_PropertyName = String.Empty;
public string PropertyName{
set{m_PropertyName = value;}
get{return m_PropertyName;}
}
private Object m_PropertyValue = null;
public Object PropertyValue{
set{m_PropertyValue = value;}
get{return m_PropertyValue;}
}
public PropertyAndValue(string PropertyName, Object PropertyValue){
m_PropertyName = PropertyName;
m_PropertyValue = PropertyValue;
}
}
[Serializable]
public class PropertyAndValueList : CollectionBase{
/// <summary>
/// Classe permettant de stocker plusieurs propriétés.
/// </summary>
public void Add(PropertyAndValue p){
List.Add(p);
}
public PropertyAndValue GetPropertyAndValue(string propertyName){
foreach(PropertyAndValue p in List){
if(p.PropertyName == propertyName){
return p;
}
}
return null;
}
}
}
Conclusion
Mes remerciements à Coq qui m'a un peu aidé. Il m'a mis sur une bonne piste pour la récupération des propriétés d'un objet.
Historique
- 04 décembre 2004 00:37:59 :
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
sauvegarde de variable [ par FaustVII ]
Faustje cherche a sauvegarder la valeur d' une variable apres l avoir modifier lors de l execution de mon programme est ce que quelqu un pourrai m exp
Implementer une interface COM existante dans un object .NET [ par FrancoisC ]
Bonjour,J'essaye d'implémenter une interface COM existantedans un object .NET (UserControl).Mais c'est interface n'est pas accessible par l'objet COM
Sauvegarde de multiple variable dans un .INI [ par CracK ]
J'aimerai savoir comment sauvegarder plusieurs variables dans un fichier .INI . ( Ecriture/Lecture )Merci , CracK
pb de variable non definie [ par kaiwoo ]
[STAThread] static void Main() { Application.Run(new Form1()); } private void textBox1_TextChanged(object sender, System.EventArgs e) { } pr
Probleme d'acces à une base Access [ par ja001net ]
Bonjour,Je fais un programme en C#.net utilisant une basse access, avec laquelle j'accède via un OleDbConnection un OleDbDataReader et un OleDbCommand
Sauvegarde Application MDI [ par inza ]
Comment enregistrer les modifications apportées à 2 DataGrid posés sur une Fiche Fille ?
Sauvegarde d'un variable [ par liliemumue ]
BonjourJe suis entrain de creer un petit logiciel qui imprime des recu , seulement chaque recu doit avoir un numéro différent.Donc je dois avoir un fi
pb verif répertoires [ par jdaviaud ]
Là je fais face à un pb dont je comprends pas la logique :Je récupère le nom du répertoire d'où s'execute mon prog :RepActuel = Directory.GetCurrentDi
Attachements outlook [ par Gabberzorus ]
Salut,Je voudrais utiliser cette méthode pour envoyer des mails avec attachements : Outlook.Attachments.Add(object Source, object Type, object Positio
HELP CONVERT OBJECT [ par sg_kan ]
Salut est ce que quelqu'un pourrez m'aidez et me dire commment fair eun cast en c# de object en DropDownList ou en CheckBox ou en TextBox..En VB ca d
|
Derniers Blogs
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|