2009-11-03 5 views
1

J'ai créé un contrôle utilisateur (CheckedDirTree) qui expose une propriété CheckedFolder qui à son tour renvoie un IEnumerable de la propriété FullPath des nœuds vérifiés dans le contrôle. Quelque chose comme ceci:Erreur de sérialisation du contrôle utilisateur

public IEnumerable<string> CheckedFolders 
    { 
     get 
     { 
      foreach (TreeNode node in treeView1.Nodes[0].DescendantNodes()) 
      { 
       if(node.Checked && !node.FullPath.Equals(_directoryRoot)) 
        yield return node.FullPath; 
      } 
     } 
    } 

Ceci est alimenté à (SymbolsShareDto) la propriété des dossiers d'une autre classe après cntrol est représenté dans une grille et l'utilisateur a vérifié certains dossiers:

using (var dirControl = new CheckedDirForm(symbolsShare)) 
       { 
        if (dirControl.ShowDialog() == DialogResult.OK) 
        { 
         var symbolsShareObj = bindingSourceShare.Current as SymbolShareModel; 
         if (symbolsShareObj != null) symbolsShareObj.Folders = dirControl.CheckedFolders; 
        } 
       } 

[DataContract] 
public class SymbolShareDTO 
{ 
    public SymbolShareDTO(){} 

    [DataMember] 
    public string Share { get; set; } 
    [DataMember] 
    public string BackupTo { get; set; } 
    [DataMember] 
    public IEnumerable<string> Folders { get; set; } 

    public override string ToString() 
    { 
     return string.Format("Share: {0}{1}BackupTo: {2}{3}Folders: {4}", Share, Environment.NewLine, BackupTo, 
          Environment.NewLine, Folders.Count()); 
    } 
} 

Cependant quand je sérialiser le SymbolsShareDto, je reçois une erreur en disant

CheckedDirTree+<get_CheckedFolders>d__6' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. 

Des pensées? Ai-je besoin de renvoyer une nouvelle propriété List from CheckedFolders à la place.

grâce Sunit

Répondre

0

Exécutez CheckedFolders.ToArray() et effectuez une sérialisation.

+0

Cela a bien fonctionné. Y at-il des avantages/inconvénients à faire ToArray ou ToList? – Sunit

+0

Non, pas vraiment. Un tableau sera plus compact quand il est sérialisé. – leppie

0

utilisation [DataContract] pour votre classe (msdn)

et [DataMember] pour chaque propriété (msdn)

0

Vous êtes probablement essayer d'envoyer des instances de SymbolsShareDto par WCF.

Tout ce que vous devez faire est de marquer avec DataContractAttribute et tous les biens avec DataMember:

[DataContract] 
public class SymbolsShareDto 
{ 
    [DataMember] 
    public int Data1 { get; set;}; 

    [DataMember] 
    public int Data2 { get; set;} 
} 

J'espère que cette aide.

+0

J'ai déjà le DTO marqué pour l'utilisation de DataContractSerializer. Voir mes modifications. – Sunit

Questions connexes