C# 从用户控件序列化错误

C# 从用户控件序列化错误,c#,C#,我创建了一个用户控件(CheckedDirTree),它公开了CheckedFolder属性,该属性反过来返回控件中已检查节点的FullPath属性的IEnumerable。大概是这样的: public IEnumerable<string> CheckedFolders { get { foreach (TreeNode node in treeView1.Nodes[0].DescendantNodes())

我创建了一个用户控件(CheckedDirTree),它公开了CheckedFolder属性,该属性反过来返回控件中已检查节点的FullPath属性的IEnumerable。大概是这样的:

 public IEnumerable<string> CheckedFolders
    {
        get
        {
            foreach (TreeNode node in treeView1.Nodes[0].DescendantNodes())
            {
                if(node.Checked && !node.FullPath.Equals(_directoryRoot))
                    yield return node.FullPath;
            }
        }
    }
public IEnumerable CheckedFolders
{
得到
{
foreach(TreeView中的TreeNode节点1.Nodes[0].DegenantNodes())
{
if(node.Checked&!node.FullPath.Equals(_directoryRoot))
屈服返回节点.FullPath;
}
}
}
在网格中显示此cntrol并且用户检查了一些文件夹后,将此内容馈送到另一个类的(SYMBOLSHAREDTO)Folders属性:

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());
    }
}
使用(var dirControl=new CheckedDirForm(symbolsShare))
{
if(dirControl.ShowDialog()==DialogResult.OK)
{
var symbolsShareObj=bindingSourceShare.Current作为SymbolShareModel;
如果(SYMBOLSHAREOBJ!=null)SYMBOLSHAREOBJ.Folders=dirControl.CheckedFolders;
}
}
[数据合同]
公共类符号共享到
{
公共符号共享到(){}
[数据成员]
公共字符串共享{get;set;}
[数据成员]
公共字符串备份到{get;set;}
[数据成员]
公共IEnumerable文件夹{get;set;}
公共重写字符串ToString()
{
返回string.Format(“共享:{0}{1}备份:{2}{3}文件夹:{4}”,共享,环境.NewLine,备份,
Environment.NewLine,Folders.Count());
}
}
然而,当我序列化SymbolsShareDto时,我得到一个错误

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. 
无法序列化CheckedDirTree+d__6。考虑使用DATACONTractAttor属性对其进行标记,并标记要使用DATAMEMBAREATE属性序列化的所有成员。 有什么想法吗?是否需要从CheckedFolders属性返回新列表

谢谢 Sunit使用
[DataContract]
适用于您的类()


[DataMember]
对于每个属性()

您可能正试图通过WCF将SymbolsShareDto的实例发送到

您只需使用DataContractAttribute标记它,并使用DataMember标记所有属性:

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

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

我希望这有帮助。

执行
检查文件夹.ToArray()
并将其序列化。

我已经标记了要使用DataContractSerializer的数据。看我的编辑,效果不错。做ToArray或ToList有什么好处/坏处吗?不,不是真的。但是,当序列化时,数组将更加紧凑。