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」オブジェクトが作成された後、ページのすべてのコントロールが含まれ、それらのそれぞれについて、その親とその子があればそれが含まれます。member をシリアライズしない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 に答える