none
Pb de sérialisation RRS feed

  • Question

  • Bonjour,

     

    Vous trouverez ci-dessous le code qui génère une exception de sérialisation lors du clic sur le bouton.

    Quelqu'un a t'il une idée?

    Merci.

     

    Contexte du test: Framework .NET3.5, Visual Studio 2008

     

    public partial class Form1 : Form

    {

    public Form1()

    {

    InitializeComponent();

    }

    private void button1_Click(object sender, EventArgs e)

    {

    string[] reports = new string[] { };

    MsgResponse msg = new MsgResponse { Data = reports };

    XmlSerializer ser = new XmlSerializer(msg.GetType());

    StringWriter content = new StringWriter();

    ser.Serialize(content, msg);

    MessageBox.Show("ok");

    }

    }

    [Serializable]

    public class MsgBase { }

    [Serializable]

    public class MsgServer : MsgBase { }

    [Serializable]

    [XmlInclude(typeof(ProfilRow))]

    [XmlInclude(typeof(UserRow))]

    [XmlInclude(typeof(UserRow[]))]

    [XmlInclude(typeof(System.String))]

    [XmlInclude(typeof(System.String[]))]

    public class MsgResponse// : MsgServer

    {

    public object Data;

    public string Error = "";

    }

    #region class ProfilRow

    [Serializable]

    [Table(Name = "Profil")]

    public class ProfilRow

    {

    public ProfilRow() { }

    #region Propri‚t‚s persistantes

    /// <summary>

    /// Id du profil utilisateur.

    /// </summary>

    [Column(Name = "Numero", IsPrimaryKey = true)]

    public int Id { get; set; }

    /// <summary>

    /// Nom du profil utilisateur.

    /// </summary>

    [Column(Name = "Nom")]

    public string Name { get; set; }

    /// <summary>

    /// Description du profil utilisateur.

    /// </summary>

    [Column(Name = "Description")]

    public string Description { get; set; }

    [Column(Name = "Options")]

    public int Options { get; set; }

    #endregion

    /// <summary>

    /// Obtient ou d‚finit un objet associ‚ au profil utilisateur.

    /// </summary>

    [XmlIgnore]

    public object Tag { get; set; }

    /// <summary>

    /// Droits du profil.

    /// Liste de bool‚ens index‚s par une string.

    /// </summary>

    [XmlIgnore]

    public Dictionary<string, bool> Rights = new Dictionary<string, bool>();

    public List<string> FilterFile = new List<string>();

    }

    #endregion

    #region class UserRow

    [Serializable]

    [Table(Name = "Utilisateur")]

    public class UserRow

    {

    #region Propri‚t‚s persistantes

    /// <summary>

    /// Id de l'utilisateur.

    /// </summary>

    [Column(Name = "Numero", IsPrimaryKey = true)]

    public int Id { get; set; }

    /// <summary>

    /// Nom de l'utilisateur.

    /// </summary>

    [Column(Name = "Nom")]

    public string Name { get; set; }

    /// <summary>

    /// Pr‚nom de l'utilisateur.

    /// </summary>

    [Column(Name = "Prenom")]

    public string FirstName { get; set; }

    /// <summary>

    /// Pseudo de l'utilisateur.

    /// </summary>

    [Column(Name = "Pseudo")]

    public string Pseudo { get; set; }

    /// <summary>

    /// Mot de passe de l'utilisateur.

    /// </summary>

    [Column(Name = "MotDePasse")]

    public string Password { get; set; }

    /// <summary>

    /// Id du profil de l'utilisateur.

    /// </summary>

    [Column(Name = "Profil")]

    public int ProfilId { get; set; }

    /// <summary>

    /// R‚serv‚

    /// </summary>

    [Column(Name = "Extension")]

    public string Extension { get; set; }

    #endregion

    public UserRow() { }

    /// <summary>

    /// Obtient ou d‚finit un objet associ‚ … l'utilisateur.

    /// </summary>

    [XmlIgnore]

    public object Tag { get; set; }

    /// <summary>

    /// Profil de l'utilisateur.

    /// </summary>

    [XmlIgnore]

    public ProfilRow Profil;

    }

    #endregion

    #region enum UserOptions

    /// <summary>

    /// Liste des options utilisateur

    /// </summary>

    [Flags]

    public enum UserOptions

    {

    LockForm = 0x00000020,

    }

    #endregion

     

    jeudi 3 juillet 2008 16:08

Réponses

  •  

    oui en effet mais ton exemple ne sérialize pas ce champ Wink tu as mis en commentaire l'héritage Wink

    ca suffit a le faire planter sur la sérialization du "object data"...en tout cas quand je l'execute tel que tu l'as écrit Smile

    ++

     

     

    PS: penses a marqué ton problème comme résolu Big Smile

    lundi 28 juillet 2008 14:40

Toutes les réponses

  • Bonjour,

     

    pouvez-vous copier/coller le message d'erreur que vous obtenez ?

    vendredi 4 juillet 2008 05:47
  • Voici le message d'exception:

    {"Erreur lors de la génération du document XML."}

    -> InnerException: {"Le type System.String[] ne peut être utilisé dans ce contexte."}

     

     

    vendredi 4 juillet 2008 06:34
  • Salut,

      Le problème que tu rencontres c'est simplement que tu mets dans un object un tableau d'object...Ca marche (et j'avous être surpris) mais le Serializer lui n'y arrive pas...

      Une solution :

    Code Snippet

    public class MsgResponse// : MsgServer

    {

      [XmlIgnore]

      public object Data

      {

        get

        {

          return DataArray;

        }

        set

        {

          if (value is object[])

            DataArray = value as object[];

          else

            DataArray = new object[] { value };

        }

      }

      public object[] DataArray { get; set; }

      public string Error = "";

    }

     

    Bon c'est pas hyper beau, le top serait d'éviter de stocker un tableau dans un champ qui n'est pas prévu pour en être un... j'ai testé et ton code marche bien en changeant juste cette classe Wink

    Bon courage et pense a marqué comme résolus si ca marche Smile

    ++

        Stéphane

    lundi 28 juillet 2008 11:17
  • Bonjour,

     

    En fait, je pense que c'est le champ FilterFile qui pose problème au serializer, plus généralement les classes génériques, pour éliminer le problème j'ai dû utiliser l'attribut XmlArrayItem:

     

    [XmlArrayItem(typeof(string))]

    public List<string> FilterFile = new List<string>();

     

    Merci quand même.

     

    lundi 28 juillet 2008 12:56
  •  

    oui en effet mais ton exemple ne sérialize pas ce champ Wink tu as mis en commentaire l'héritage Wink

    ca suffit a le faire planter sur la sérialization du "object data"...en tout cas quand je l'execute tel que tu l'as écrit Smile

    ++

     

     

    PS: penses a marqué ton problème comme résolu Big Smile

    lundi 28 juillet 2008 14:40