从用户控件序列化错误

时间:2009-11-03 14:04:09

标签: c#

我创建了一个公开CheckedFolder属性的用户控件(CheckedDirTree),该属性又返回控件中检查的Nodes的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;
            }
        }
    }

这个cntrol在网格中显示并且用户检查了一些文件夹之后,它被送到另一个类(SymbolsShareDto)文件夹属性:

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());
    }
}

然而,当我序列化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. 

有什么想法?我是否需要从CheckedFolders属性返回一个新列表。

感谢 苏尼特

3 个答案:

答案 0 :(得分:0)

使用 您的班级[DataContract]

[DataMember] 每个属性(msdn

和{{1}}

答案 1 :(得分:0)

您可能正在尝试通过WCF发送SymbolsShareDto的实例。

您所要做的就是使用DataContractAttribute标记它,并使用DataMember标记所有属性:

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

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

我希望这有帮助。

答案 2 :(得分:0)

执行CheckedFolders.ToArray()并序列化。