检测到Protobuf-net可能的递归:序列化孩子和父母

时间:2012-08-27 13:29:52

标签: c# protocol-buffers protobuf-net

我是序列化的新手,甚至是protobuf的新手。这是我的问题,我有这些课程:

[ProtoContract]
class Controle
{
    [ProtoMember(1, AsReference=true)]
    public HashSet<Controle> ControlesInternes { get; set; }
    [ProtoMember(2)]
    public string TypeControle { get; set; }
    [ProtoMember(3)]
    public Dictionary<string, string> Attributs { get; set; }
    [ProtoMember(4)]
    public int Ligne { get; set; }
    [ProtoMember(5)]
    public string InnerText { get; set; }
    [ProtoMember(6)]
    public Controle Parent { get; set; }

    public Controle()
    {
        ControlesInternes = new HashSet<Controle>();
        Attributs = new Dictionary<string, string>();
    }
}

[ProtoContract(SkipConstructor=true)]
class PageAspx
{

    [ProtoMember(1)]
    public string PrefixeControleOnilait { get; set; }
    [ProtoMember(2, AsReference = true)]
    public HashSet<Controle> Controles { get; set; }

    private string CheminTmp;

    private string nomFichier;

    [ProtoMember(3)]
    public string NomFichier
    {
        get { return nomFichier; }
        set { nomFichier = value; }
    }

    private string titre;
    [ProtoMember(4)]
    public string Titre
    {
        get { return titre; }
        set { titre = value; }
    }


    public PageAspx()
    { }

    public PageAspx(string pNomFichier)
    {
        this.NomFichier = pNomFichier;

        this.Controles = new HashSet<Controle>();
    }
}

尝试序列化时,我收到“检测到可能的递归”错误。

但基本上,我的代码列出了aspx页面中的所有控件,并且它们是层次结构(子级,父级)。这意味着在我的“PageAspx”对象生成之后,它包含页面的所有控件,并且对于每个控件都包含其父级及其子级(如果有)。当我没有序列化成员ControlesInternes时,序列化进展顺利。但我需要这些信息。

如何使用protobuf保存这些数据?

1 个答案:

答案 0 :(得分:5)

我找到了一个解决方案:我没有序列化父项,我在“Controle”类中反序列化后使用了这个函数:

    [ProtoAfterDeserialization]
    protected void OnDeserialized()
    {
        if (ControlesInternes.Count > 0)
        {
            foreach (var ctl in ControlesInternes)
            {
                ctl.Parent = this;
            }
        }
    }