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
MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLETECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLE par ROMELARD Fabrice
Speakers: Julien Marechal, Gautier Confiant, Sébastien MEYER La session débute par le positionnement de la solution System Center par rapport aux concepts d'organisation ITIL. Le portail du catalogue de se...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|