4

一般来说,我是序列化的新手,甚至对 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 保存这些数据?

4

1 回答 1

5

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

    [ProtoAfterDeserialization]
    protected void OnDeserialized()
    {
        if (ControlesInternes.Count > 0)
        {
            foreach (var ctl in ControlesInternes)
            {
                ctl.Parent = this;
            }
        }
    }
于 2012-08-27T14:38:32.143 回答