OVH Cloud OVH Cloud

Serialization de mails impossibles

3 réponses
Avatar
Philippe M
Voilà, dans mon appli, je dois serializer des mailmessages que j'avais
stockés dans une listbox.
Or, la classe Mailmessage n'est pas sérializable.
Celà me force a mettre dans un fichier texte les propriétés du mailmessage
en ToString(), puis une fois sauvegardés, les rebalancer dans une listbox en
créant des nouveaux mails .

Bref, je voudrais savoir si il y a un moyen plus simple qui se rapprocherai
de la sérialization. Car, je dois sauvegarder ces mails a l'écart une fois
l'appli fermée, puis lorsque l'appli se lance, charger les mails dans les
listbox.

voilà un bout de code :

//serialization des mailsmessages stockés dans une listbox
using system.web.mail
.
.
.
MailMessage[] lesmelsaves = new MailMessage[lbsaves.Items.Count];
IFormatter fmt = new BinaryFormatter();
Stream ficOutsaves = new
FileStream("melsave.bin",FileMode.Create,FileAccess.Write);
for (int i=0;i < lbsaves.Items.Count; i++)
{if (lbsaves.Items.Count!=0)
lesmelsaves[i]=(MailMessage) lbsaves.Items[i];
}
if (lbsaves.Items.Count!=0)
fmt.Serialize(ficOutsaves,lesmelsaves);

// Et crack !!! une exception se leve en disant que Mailmessage n'est pas
sérialisable

Voilà, j'avais une idée de créer une classe nomée "mel" qui hériterai de
Mailmessage( pour la defenir serializable), mais je ne m'en rappelle plus
trop le déroulement, donc si vous pouviez m'aider.
Merci

3 réponses

Avatar
Paul Bacelar
Le but de la sérialisation est d'avoir une représentation sous forme de
tableau d'octets d'objets qui soit indépendants des versions des objets et
des frameworks qui les ont créés. Pouvoir sérialiser depuis .NET pour
desérialiser en JAVA et vice vers ça, par exemple.

Dans ce cadre, il semble que MailMessage soit trop lié à l'environnement
pour qu'il puisse entièrement migrer dans un flux d'octet.

Si vous n'avez pas besoin de toutes les propriétés que contient un
"MailMessage", rien ne vous empêche de créer une classe fille de MailMessage
et qui implémentera l'interface ISerializable pour vous permettre de
correctement sérialiser le sous-ensemble des données qui vous intéressent,
cette sérialisation de la sous-classe ne sera donc plus liée à l'
environnement qui l'a engendré.

--
Paul Bacelar

"Philippe M" <Philippe wrote in message
news:
Voilà, dans mon appli, je dois serializer des mailmessages que j'avais
stockés dans une listbox.
Or, la classe Mailmessage n'est pas sérializable.
Celà me force a mettre dans un fichier texte les propriétés du mailmessage
en ToString(), puis une fois sauvegardés, les rebalancer dans une listbox


en
créant des nouveaux mails .

Bref, je voudrais savoir si il y a un moyen plus simple qui se


rapprocherai
de la sérialization. Car, je dois sauvegarder ces mails a l'écart une fois
l'appli fermée, puis lorsque l'appli se lance, charger les mails dans les
listbox.

voilà un bout de code :

//serialization des mailsmessages stockés dans une listbox
using system.web.mail
.
.
.
MailMessage[] lesmelsaves = new MailMessage[lbsaves.Items.Count];
IFormatter fmt = new BinaryFormatter();
Stream ficOutsaves = new
FileStream("melsave.bin",FileMode.Create,FileAccess.Write);
for (int i=0;i < lbsaves.Items.Count; i++)
{if (lbsaves.Items.Count!=0)
lesmelsaves[i]=(MailMessage) lbsaves.Items[i];
}
if (lbsaves.Items.Count!=0)
fmt.Serialize(ficOutsaves,lesmelsaves);

// Et crack !!! une exception se leve en disant que Mailmessage n'est pas
sérialisable

Voilà, j'avais une idée de créer une classe nomée "mel" qui hériterai de
Mailmessage( pour la defenir serializable), mais je ne m'en rappelle plus
trop le déroulement, donc si vous pouviez m'aider.
Merci


Avatar
Philippe M
Merci pour cette expliquation, je viens de essayer le code et ... ça ne
fonctionne pas.
En fait la Classe Mailmessage n'est pas Sérializable.
Moi, j'ai crée une classe qui hérite de Mailmessage et qui Implemente
Iserializable, comme vous l'aviez mentionné.
J'ai fait mes manipulations de seriaization.
ça fonctionne mais les données ne sont pas accessibles.
Je m'explique. lorsque je serialize ma classe, les objets rentrés sont a
valeur nulle. Je me suis rendu compte qu'il y avait un probleme dans la
méthode implémentée :
public void GetObjectData(System.Runtime.Serialization.SerializationInfo
info, System.Runtime.Serialization.StreamingContext context)

Puis en me renseignant sur l'aide du framework :"Sérialisation personnalisée"
Il est mentionné :" Les classes dérivées doivent appeler la méthode
GetObjectData sur l'objet de base si ce dernier implémente ISerializable.
"

Etant donné que MailMessage n'est as serializable, j'en conclu quil
n'implemente pas ISerializable.
Puis Etant que ISerializable est une interface et donc me force a adopter sa
méthode:public void
GetObjectData(System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context) que je ne paux
utiliser car MailMessage n'est pas implémenté par ISerializable.

Je me rend compte que la serialization n'est pas faisable dans ce chemin
d'idée là.

J'aimerai savoir Si j'ai tord ou non. Puis si il y a moyen de contourner
pour que je fasse ma sérialization.

Vous trouverez ci-joint le code de la classe.

using System;
using System.Runtime.Serialization;
using System.Collections;

namespace Reveil
{
/// <summary>
///
/// </summary>
[Serializable]
public class Mail : System.Web.Mail.MailMessage ,
System.Runtime.Serialization.ISerializable
{
public Mail(): base()
{

}

private static readonly Mail theOneObject = new Mail();

public static Mail GetMail()
{
return theOneObject;
}


#region Membres de ISerializable
public void GetObjectData(System.Runtime.Serialization.SerializationInfo
info, System.Runtime.Serialization.StreamingContext context)
{


// Instead of serializing this object,
// serialize a MailSerializationHelp instead.
info.SetType(typeof(MailSerializationHelper));
// No other values need to be added.


}
#endregion

[Serializable]
internal sealed class MailSerializationHelper : IObjectReference
{
// This object has no fields (although it could).

// GetRealObject is called after this object is deserialized.
public Object GetRealObject(StreamingContext context)
{
// When deserialiing this object, return a reference to
// the Mail object instead.
return Mail.theOneObject;
}
}

}
}

J'aimerai savoir Si j'ai tord ou non. Puis si il y a moyen de contourner
pour que je fasse ma sérialization.




"Paul Bacelar" a écrit :

Le but de la sérialisation est d'avoir une représentation sous forme de
tableau d'octets d'objets qui soit indépendants des versions des objets et
des frameworks qui les ont créés. Pouvoir sérialiser depuis .NET pour
desérialiser en JAVA et vice vers ça, par exemple.

Dans ce cadre, il semble que MailMessage soit trop lié à l'environnement
pour qu'il puisse entièrement migrer dans un flux d'octet.

Si vous n'avez pas besoin de toutes les propriétés que contient un
"MailMessage", rien ne vous empêche de créer une classe fille de MailMessage
et qui implémentera l'interface ISerializable pour vous permettre de
correctement sérialiser le sous-ensemble des données qui vous intéressent,
cette sérialisation de la sous-classe ne sera donc plus liée à l'
environnement qui l'a engendré.

--
Paul Bacelar

"Philippe M" <Philippe wrote in message
news:
> Voilà, dans mon appli, je dois serializer des mailmessages que j'avais
> stockés dans une listbox.
> Or, la classe Mailmessage n'est pas sérializable.
> Celà me force a mettre dans un fichier texte les propriétés du mailmessage
> en ToString(), puis une fois sauvegardés, les rebalancer dans une listbox
en
> créant des nouveaux mails .
>
> Bref, je voudrais savoir si il y a un moyen plus simple qui se
rapprocherai
> de la sérialization. Car, je dois sauvegarder ces mails a l'écart une fois
> l'appli fermée, puis lorsque l'appli se lance, charger les mails dans les
> listbox.
>
> voilà un bout de code :
>
> //serialization des mailsmessages stockés dans une listbox
> using system.web.mail
> .
> .
> .
> MailMessage[] lesmelsaves = new MailMessage[lbsaves.Items.Count];
> IFormatter fmt = new BinaryFormatter();
> Stream ficOutsaves = new
> FileStream("melsave.bin",FileMode.Create,FileAccess.Write);
> for (int i=0;i < lbsaves.Items.Count; i++)
> {if (lbsaves.Items.Count!=0)
> lesmelsaves[i]=(MailMessage) lbsaves.Items[i];
> }
> if (lbsaves.Items.Count!=0)
> fmt.Serialize(ficOutsaves,lesmelsaves);
>
> // Et crack !!! une exception se leve en disant que Mailmessage n'est pas
> sérialisable
>
> Voilà, j'avais une idée de créer une classe nomée "mel" qui hériterai de
> Mailmessage( pour la defenir serializable), mais je ne m'en rappelle plus
> trop le déroulement, donc si vous pouviez m'aider.
> Merci





Avatar
Philippe M
Merci pour cette expliquation, je viens de essayer le code et ... ça ne
fonctionne pas.
En fait la Classe Mailmessage n'est pas Sérializable.
Moi, j'ai crée une classe qui hérite de Mailmessage et qui Implemente
Iserializable, comme vous l'aviez mentionné.
J'ai fait mes manipulations de seriaization.
ça fonctionne mais les données ne sont pas accessibles.
Je m'explique. lorsque je serialize ma classe, les objets rentrés sont a
valeur nulle. Je me suis rendu compte qu'il y avait un probleme dans la
méthode implémentée :
public void GetObjectData(System.Runtime.Serialization.SerializationInfo
info, System.Runtime.Serialization.StreamingContext context)

Puis en me renseignant sur l'aide du framework :"Sérialisation personnalisée"
Il est mentionné :" Les classes dérivées doivent appeler la méthode
GetObjectData sur l'objet de base si ce dernier implémente ISerializable.
"

Etant donné que MailMessage n'est as serializable, j'en conclu quil
n'implemente pas ISerializable.
Puis Etant que ISerializable est une interface et donc me force a adopter sa
méthode:public void
GetObjectData(System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context) que je ne paux
utiliser car MailMessage n'est pas implémenté par ISerializable.

Je me rend compte que la serialization n'est pas faisable dans ce chemin
d'idée là.

J'aimerai savoir Si j'ai tord ou non. Puis si il y a moyen de contourner
pour que je fasse ma sérialization.

Vous trouverez ci-joint le code de la classe.

using System;
using System.Runtime.Serialization;
using System.Collections;

namespace Reveil
{
/// <summary>
///
/// </summary>
[Serializable]
public class Mail : System.Web.Mail.MailMessage ,
System.Runtime.Serialization.ISerializable
{
public Mail(): base()
{

}

private static readonly Mail theOneObject = new Mail();

public static Mail GetMail()
{
return theOneObject;
}


#region Membres de ISerializable
public void GetObjectData(System.Runtime.Serialization.SerializationInfo
info, System.Runtime.Serialization.StreamingContext context)
{


// Instead of serializing this object,
// serialize a MailSerializationHelp instead.
info.SetType(typeof(MailSerializationHelper));
// No other values need to be added.


}
#endregion

[Serializable]
internal sealed class MailSerializationHelper : IObjectReference
{
// This object has no fields (although it could).

// GetRealObject is called after this object is deserialized.
public Object GetRealObject(StreamingContext context)
{
// When deserialiing this object, return a reference to
// the Mail object instead.
return Mail.theOneObject;
}
}

}
}

J'aimerai savoir Si j'ai tord ou non. Puis si il y a moyen de contourner
pour que je fasse ma sérialization.




"Paul Bacelar" a écrit :

Le but de la sérialisation est d'avoir une représentation sous forme de
tableau d'octets d'objets qui soit indépendants des versions des objets et
des frameworks qui les ont créés. Pouvoir sérialiser depuis .NET pour
desérialiser en JAVA et vice vers ça, par exemple.

Dans ce cadre, il semble que MailMessage soit trop lié à l'environnement
pour qu'il puisse entièrement migrer dans un flux d'octet.

Si vous n'avez pas besoin de toutes les propriétés que contient un
"MailMessage", rien ne vous empêche de créer une classe fille de MailMessage
et qui implémentera l'interface ISerializable pour vous permettre de
correctement sérialiser le sous-ensemble des données qui vous intéressent,
cette sérialisation de la sous-classe ne sera donc plus liée à l'
environnement qui l'a engendré.

--
Paul Bacelar

"Philippe M" <Philippe wrote in message
news:
> Voilà, dans mon appli, je dois serializer des mailmessages que j'avais
> stockés dans une listbox.
> Or, la classe Mailmessage n'est pas sérializable.
> Celà me force a mettre dans un fichier texte les propriétés du mailmessage
> en ToString(), puis une fois sauvegardés, les rebalancer dans une listbox
en
> créant des nouveaux mails .
>
> Bref, je voudrais savoir si il y a un moyen plus simple qui se
rapprocherai
> de la sérialization. Car, je dois sauvegarder ces mails a l'écart une fois
> l'appli fermée, puis lorsque l'appli se lance, charger les mails dans les
> listbox.
>
> voilà un bout de code :
>
> //serialization des mailsmessages stockés dans une listbox
> using system.web.mail
> .
> .
> .
> MailMessage[] lesmelsaves = new MailMessage[lbsaves.Items.Count];
> IFormatter fmt = new BinaryFormatter();
> Stream ficOutsaves = new
> FileStream("melsave.bin",FileMode.Create,FileAccess.Write);
> for (int i=0;i < lbsaves.Items.Count; i++)
> {if (lbsaves.Items.Count!=0)
> lesmelsaves[i]=(MailMessage) lbsaves.Items[i];
> }
> if (lbsaves.Items.Count!=0)
> fmt.Serialize(ficOutsaves,lesmelsaves);
>
> // Et crack !!! une exception se leve en disant que Mailmessage n'est pas
> sérialisable
>
> Voilà, j'avais une idée de créer une classe nomée "mel" qui hériterai de
> Mailmessage( pour la defenir serializable), mais je ne m'en rappelle plus
> trop le déroulement, donc si vous pouviez m'aider.
> Merci