Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Nouveau : Pb pour implémenter dans une classe ISerializable

7 réponses
Avatar
Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax
Je souhaite implémenter ISerializable dans une classe. J'ai cherché un peu
partout, et je n'arrive pas à accéder à Serialize lorsque j'utilise ma
classe. Voici le code de la classe (classeDeBase) :

using System.Windows.Forms;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.Security.Permissions;


namespace Design_Patterns
{
[Serializable]
public class classeDeBase : ISerializable
{
protected classeDeBase(SerializationInfo info, StreamingContext
context){}

[SecurityPermissionAttribute(SecurityAction.Demand,
SerializationFormatter = true)]
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.AddValue ("coucou", true );
}
}
}

Votre aide sera bienvenue (comme vous le voyez je débute en C#).

Christian

7 réponses

Avatar
Patrice
Bonjour,

Cf la doc :
http://msdn.microsoft.com/fr-fr/library/szzyf24s(VS.80).aspx

Serialize fait partie d'une autre classe qui va sérialiser l'objet.
ISerializable ne fait que fournir les infos (ce qui permet de sérialiser
sous des formats divers et variés selon le serializeur utilisé) si bsesoin
est. Par exemple commencer par sérializer une classe avec des types de base
que le sérializateur va savoir gérer...


--
Patrice


"Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax" a
écrit dans le message de news:%
Je souhaite implémenter ISerializable dans une classe. J'ai cherché un peu
partout, et je n'arrive pas à accéder à Serialize lorsque j'utilise ma
classe. Voici le code de la classe (classeDeBase) :

using System.Windows.Forms;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.Security.Permissions;


namespace Design_Patterns
{
[Serializable]
public class classeDeBase : ISerializable
{
protected classeDeBase(SerializationInfo info, StreamingContext
context){}

[SecurityPermissionAttribute(SecurityAction.Demand,
SerializationFormatter = true)]
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.AddValue ("coucou", true );
}
}
}

Votre aide sera bienvenue (comme vous le voyez je débute en C#).

Christian





Avatar
Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax
Merci.

Ce n'est pas exactement ce que je souhaitais faire : si je peux surcharger
GetObjectData, cela me permet de sérialiser exactement ce dont j'ai besoin,
et non la classe elle-même.

Typiquement, en VB6, j'aurais écrit une fonction Save. Ici, je voudrais
écrire un XML avec les champs que je contrôle parfaitement au travers de
l'appel de GetObjectData.

Je ne sais pas si je peux le faire en XML, du fait même de la structure XML.

Christian


"Patrice" <http://scribe-fr.blogspot.com/> a écrit dans le message de
news:
Bonjour,

Cf la doc :
http://msdn.microsoft.com/fr-fr/library/szzyf24s(VS.80).aspx

Serialize fait partie d'une autre classe qui va sérialiser l'objet.
ISerializable ne fait que fournir les infos (ce qui permet de sérialiser
sous des formats divers et variés selon le serializeur utilisé) si bsesoin
est. Par exemple commencer par sérializer une classe avec des types de
base que le sérializateur va savoir gérer...


--
Patrice


"Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax"
a écrit dans le message de news:%
Je souhaite implémenter ISerializable dans une classe. J'ai cherché un
peu partout, et je n'arrive pas à accéder à Serialize lorsque j'utilise
ma classe. Voici le code de la classe (classeDeBase) :

using System.Windows.Forms;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.Security.Permissions;


namespace Design_Patterns
{
[Serializable]
public class classeDeBase : ISerializable
{
protected classeDeBase(SerializationInfo info, StreamingContext
context){}

[SecurityPermissionAttribute(SecurityAction.Demand,
SerializationFormatter = true)]
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.AddValue ("coucou", true );
}
}
}

Votre aide sera bienvenue (comme vous le voyez je débute en C#).

Christian








Avatar
Patrice
Serialize est la méthode qui effectue la sérialization. Le "n'arrive pas à
accéder à Serialize" me faisait donc penser que tu n'arrivais pas à utiliser
le sérialiseur ce qui n'est pas directement à l'implémentation de
ISerializable.

Je crois maintenant comprendre que le problème est d'ignorer un champ auquel
cas il suffit de lui appliquer un attribut NonSerialized...

Sinon expliquer plus précisemment "sérialiser exactement ce dont j'ai
besoin" (par exemple un exemple de classe avec 2/3 champs, le XML obtenu et
le changement que l'on voudrait apporter, pour l'instant je crois comprendre
qu'il s"agit juste d"ignorer un champ)

--
Patrice


"Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax" a
écrit dans le message de news:uYfw9O%
Merci.

Ce n'est pas exactement ce que je souhaitais faire : si je peux surcharger
GetObjectData, cela me permet de sérialiser exactement ce dont j'ai
besoin, et non la classe elle-même.

Typiquement, en VB6, j'aurais écrit une fonction Save. Ici, je voudrais
écrire un XML avec les champs que je contrôle parfaitement au travers de
l'appel de GetObjectData.

Je ne sais pas si je peux le faire en XML, du fait même de la structure
XML.

Christian


"Patrice" <http://scribe-fr.blogspot.com/> a écrit dans le message de
news:
Bonjour,

Cf la doc :
http://msdn.microsoft.com/fr-fr/library/szzyf24s(VS.80).aspx

Serialize fait partie d'une autre classe qui va sérialiser l'objet.
ISerializable ne fait que fournir les infos (ce qui permet de sérialiser
sous des formats divers et variés selon le serializeur utilisé) si
bsesoin est. Par exemple commencer par sérializer une classe avec des
types de base que le sérializateur va savoir gérer...


--
Patrice


"Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax"
a écrit dans le message de
news:%
Je souhaite implémenter ISerializable dans une classe. J'ai cherché un
peu partout, et je n'arrive pas à accéder à Serialize lorsque j'utilise
ma classe. Voici le code de la classe (classeDeBase) :

using System.Windows.Forms;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.Security.Permissions;


namespace Design_Patterns
{
[Serializable]
public class classeDeBase : ISerializable
{
protected classeDeBase(SerializationInfo info, StreamingContext
context){}

[SecurityPermissionAttribute(SecurityAction.Demand,
SerializationFormatter = true)]
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.AddValue ("coucou", true );
}
}
}

Votre aide sera bienvenue (comme vous le voyez je débute en C#).

Christian











Avatar
Patrice
Euh c'est bien XML ? le code original semblait plutôt vouloir utiliser un
"BinaryFormatter". Je proposerai de démarrer avec :

using System;
using System.Xml.Serialization;
namespace ConsoleApplication1
{
public class Data
{
public string a;
[XmlIgnore] public string b;
public string c;
}
class Program
{
static void Main(string[] args)
{
Data data = new Data { a = "A", b = "B", c = "C" };
XmlSerializer xml = new XmlSerializer(typeof(Data));
xml.Serialize(Console.Out, data);
Console.ReadKey();
}
}
}

Ce qui donne :
<?xml version="1.0" encoding="ibm850"?>
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<a>A</a>
<c>C</c>
</Data>

Donc B n'est pas sérialisé. Que veut on changer à partir de ce point de
départ ?

--
Patrice


"Patrice" <http://scribe-fr.blogspot.com/> a écrit dans le message de
news:
Serialize est la méthode qui effectue la sérialization. Le "n'arrive pas à
accéder à Serialize" me faisait donc penser que tu n'arrivais pas à
utiliser le sérialiseur ce qui n'est pas directement à l'implémentation de
ISerializable.

Je crois maintenant comprendre que le problème est d'ignorer un champ
auquel cas il suffit de lui appliquer un attribut NonSerialized...

Sinon expliquer plus précisemment "sérialiser exactement ce dont j'ai
besoin" (par exemple un exemple de classe avec 2/3 champs, le XML obtenu
et le changement que l'on voudrait apporter, pour l'instant je crois
comprendre qu'il s"agit juste d"ignorer un champ)

--
Patrice


"Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax"
a écrit dans le message de news:uYfw9O%
Merci.

Ce n'est pas exactement ce que je souhaitais faire : si je peux
surcharger GetObjectData, cela me permet de sérialiser exactement ce dont
j'ai besoin, et non la classe elle-même.

Typiquement, en VB6, j'aurais écrit une fonction Save. Ici, je voudrais
écrire un XML avec les champs que je contrôle parfaitement au travers de
l'appel de GetObjectData.

Je ne sais pas si je peux le faire en XML, du fait même de la structure
XML.

Christian


"Patrice" <http://scribe-fr.blogspot.com/> a écrit dans le message de
news:
Bonjour,

Cf la doc :
http://msdn.microsoft.com/fr-fr/library/szzyf24s(VS.80).aspx

Serialize fait partie d'une autre classe qui va sérialiser l'objet.
ISerializable ne fait que fournir les infos (ce qui permet de sérialiser
sous des formats divers et variés selon le serializeur utilisé) si
bsesoin est. Par exemple commencer par sérializer une classe avec des
types de base que le sérializateur va savoir gérer...


--
Patrice


"Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax"
a écrit dans le message de
news:%
Je souhaite implémenter ISerializable dans une classe. J'ai cherché un
peu partout, et je n'arrive pas à accéder à Serialize lorsque j'utilise
ma classe. Voici le code de la classe (classeDeBase) :

using System.Windows.Forms;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.Security.Permissions;


namespace Design_Patterns
{
[Serializable]
public class classeDeBase : ISerializable
{
protected classeDeBase(SerializationInfo info, StreamingContext
context){}

[SecurityPermissionAttribute(SecurityAction.Demand,
SerializationFormatter = true)]
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.AddValue ("coucou", true );
}
}
}

Votre aide sera bienvenue (comme vous le voyez je débute en C#).

Christian














Avatar
Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax
Merci de ton code : il m'éclaire bien.

En fait, l'avantage lorsque la sérialisation appelle GetObjectData, c'est
que cette fonction fournit exactement ce qu'il faut enregistrer dans le
fichier, qui n'aura a-priori pas grand chose à voir avec la classe (l'objet
en fait) elle-même, et encore moins avec ses membres.

Mais je me dis que ce n'est pas forcément la bonne manière de penser les
choses en utilisant le Framework et cette fonction de sérialisation.

Pour moi la classe est un outil qui encapsule des datas et des process, et
qui fournit des propriétés. Ses inputs doivent être persistants sur disque,
et elle les charge en même temps que la création de l'objet lui-même
(grossièrement).

D'après ce que je comprends, cette sérialisation permet plus de "sauver"
l'objet en l'état, ce qui est une autre manière d'approcher la question.
Pourquoi pas. Mais il faut que j'y réfléchisse plus avant.

Suis-je dans l'erreur ?

Christian



"Patrice" <http://scribe-fr.blogspot.com/> a écrit dans le message de
news:
Euh c'est bien XML ? le code original semblait plutôt vouloir utiliser un
"BinaryFormatter". Je proposerai de démarrer avec :

using System;
using System.Xml.Serialization;
namespace ConsoleApplication1
{
public class Data
{
public string a;
[XmlIgnore] public string b;
public string c;
}
class Program
{
static void Main(string[] args)
{
Data data = new Data { a = "A", b = "B", c = "C" };
XmlSerializer xml = new XmlSerializer(typeof(Data));
xml.Serialize(Console.Out, data);
Console.ReadKey();
}
}
}

Ce qui donne :
<?xml version="1.0" encoding="ibm850"?>
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<a>A</a>
<c>C</c>
</Data>

Donc B n'est pas sérialisé. Que veut on changer à partir de ce point de
départ ?

--
Patrice


"Patrice" <http://scribe-fr.blogspot.com/> a écrit dans le message de
news:
Serialize est la méthode qui effectue la sérialization. Le "n'arrive pas
à accéder à Serialize" me faisait donc penser que tu n'arrivais pas à
utiliser le sérialiseur ce qui n'est pas directement à l'implémentation
de ISerializable.

Je crois maintenant comprendre que le problème est d'ignorer un champ
auquel cas il suffit de lui appliquer un attribut NonSerialized...

Sinon expliquer plus précisemment "sérialiser exactement ce dont j'ai
besoin" (par exemple un exemple de classe avec 2/3 champs, le XML obtenu
et le changement que l'on voudrait apporter, pour l'instant je crois
comprendre qu'il s"agit juste d"ignorer un champ)

--
Patrice


"Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax"
a écrit dans le message de
news:uYfw9O%
Merci.

Ce n'est pas exactement ce que je souhaitais faire : si je peux
surcharger GetObjectData, cela me permet de sérialiser exactement ce
dont j'ai besoin, et non la classe elle-même.

Typiquement, en VB6, j'aurais écrit une fonction Save. Ici, je voudrais
écrire un XML avec les champs que je contrôle parfaitement au travers de
l'appel de GetObjectData.

Je ne sais pas si je peux le faire en XML, du fait même de la structure
XML.

Christian


"Patrice" <http://scribe-fr.blogspot.com/> a écrit dans le message de
news:
Bonjour,

Cf la doc :
http://msdn.microsoft.com/fr-fr/library/szzyf24s(VS.80).aspx

Serialize fait partie d'une autre classe qui va sérialiser l'objet.
ISerializable ne fait que fournir les infos (ce qui permet de
sérialiser sous des formats divers et variés selon le serializeur
utilisé) si bsesoin est. Par exemple commencer par sérializer une
classe avec des types de base que le sérializateur va savoir gérer...


--
Patrice


"Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax"
a écrit dans le message de
news:%
Je souhaite implémenter ISerializable dans une classe. J'ai cherché un
peu partout, et je n'arrive pas à accéder à Serialize lorsque
j'utilise ma classe. Voici le code de la classe (classeDeBase) :

using System.Windows.Forms;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.Security.Permissions;


namespace Design_Patterns
{
[Serializable]
public class classeDeBase : ISerializable
{
protected classeDeBase(SerializationInfo info, StreamingContext
context){}

[SecurityPermissionAttribute(SecurityAction.Demand,
SerializationFormatter = true)]
void ISerializable.GetObjectData(SerializationInfo info,
StreamingContext context)
{
info.AddValue ("coucou", true );
}
}
}

Votre aide sera bienvenue (comme vous le voyez je débute en C#).

Christian

















Avatar
Patrice
> En fait, l'avantage lorsque la sérialisation appelle GetObjectData, c'est
que cette fonction fournit exactement ce qu'il faut enregistrer dans le
fichier, qui n'aura a-priori pas grand chose à voir avec la classe
(l'objet en fait) elle-même, et encore moins avec ses membres.



Normalement la sérialisation a pour but de pouvoir sauver un objet pour
ensuite le restaurer dans le même état. Eventuellement il est possible de
prendre le contrôle (par exemple pour sauver une image qui appartiendrait à
l'objet dans un format particulier ou pouvoir sauver un objet dans une
version et le restaurer vers une version ultérieure en prenant en compte les
différences, prendre en charge des hiérarchies complexes etc...)

Pour l'instant ce que tu décris évoque pour moi plutôt tout simplement un
fichier c'est-à-dire un objet qui permet de lire ou d'écrire des données qui
n'ont absolument rien à voir avec l'objet lui-même. Voir peut-être les flux
http://msdn.microsoft.com/fr-fr/library/system.io.stream(VS.80).aspx ?

Par exemple une application comme un traitement de texte va sans doute avoir
une fonction de sauvegarde explicite qui sauvera les données actuellement
gérées sous un format bien précis n'ayant sans doute rien à voir avec la
structure des classes de l'application. Utiliser la sérialisation serait
sans doute une erreur de perspective (on veut sauver un document
utilisateur, pas un objet pour programmeurs).

--
Patrice
Avatar
Christian Hubert-Hugoud / weabow - Xtrem7 - Groobax
Merci, c'est exactement cela. Tes renseignements sont précieux.

Merci

"Patrice" <http://scribe-fr.blogspot.com/> a écrit dans le message de
news:eaO6r%
En fait, l'avantage lorsque la sérialisation appelle GetObjectData, c'est
que cette fonction fournit exactement ce qu'il faut enregistrer dans le
fichier, qui n'aura a-priori pas grand chose à voir avec la classe
(l'objet en fait) elle-même, et encore moins avec ses membres.



Normalement la sérialisation a pour but de pouvoir sauver un objet pour
ensuite le restaurer dans le même état. Eventuellement il est possible de
prendre le contrôle (par exemple pour sauver une image qui appartiendrait
à l'objet dans un format particulier ou pouvoir sauver un objet dans une
version et le restaurer vers une version ultérieure en prenant en compte
les différences, prendre en charge des hiérarchies complexes etc...)

Pour l'instant ce que tu décris évoque pour moi plutôt tout simplement un
fichier c'est-à-dire un objet qui permet de lire ou d'écrire des données
qui n'ont absolument rien à voir avec l'objet lui-même. Voir peut-être les
flux http://msdn.microsoft.com/fr-fr/library/system.io.stream(VS.80).aspx
?

Par exemple une application comme un traitement de texte va sans doute
avoir une fonction de sauvegarde explicite qui sauvera les données
actuellement gérées sous un format bien précis n'ayant sans doute rien à
voir avec la structure des classes de l'application. Utiliser la
sérialisation serait sans doute une erreur de perspective (on veut sauver
un document utilisateur, pas un objet pour programmeurs).

--
Patrice