You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Protobuf-net 3.2.52序列化递归异常问题求助

Protobuf-net 3.2.52序列化递归异常问题排查

我正在使用Protobuf-net 3.2.52版本,序列化时触发如下异常:

Possible recursion detected (offset: 3 level(s)): Loop_Protobuf.Core_E.Part

我已查阅StackOverflow等平台上相关问题的帖子,但其中给出的解决方案均针对旧版本,不适用于Protobuf-net 3.2.52。

我的代码基于一个抽象类和3个派生类,具体代码如下:

[ProtoContract(SkipConstructor = true)]
[ProtoInclude(100, typeof(Concept))]
[ProtoInclude(101, typeof(Component))]
[ProtoInclude(102, typeof(Part))]
public abstract class BaseComponent
{
    [ProtoMember(1)]
    protected List<BaseComponent> _SubComponents;

    [ProtoMember(2)]
    protected BaseComponent myParent;

    public BaseComponent(BaseComponent parent)
    {
        myParent = parent;
    }

    public virtual void AddSubComponent(BaseComponent component)
    {
        if (_SubComponents == null) _SubComponents = new List<BaseComponent>();

        _SubComponents.Add(component);
    }
}

[ProtoContract(SkipConstructor = true)]
public class Concept : BaseComponent
{
    [ProtoMember(1)]
    private string _Name;

    public Concept(BaseComponent parent) : base(parent)
    {
        _Name = "Concept1";
    }
}

[ProtoContract(SkipConstructor = true)]
public class Component : BaseComponent
{
    [ProtoMember(1)]
    private List<Part> _Parts;

    public Component(BaseComponent parent) : base(parent)
    {
        _Parts = new List<Part>();
        _Parts.Add(new Part(this, "part1", 10, 20));
        _Parts.Add(new Part(this, "part2", 20, 20));
        _Parts.Add(new Part(this, "part3", 30, 20));
    }
}

[ProtoContract(SkipConstructor = true)]
public class Part : BaseComponent
{
    [ProtoMember(1)]
    private string _Name;

    [ProtoMember(2)]
    private double _Width;

    [ProtoMember(3)]
    private double _Height;

    public Part(BaseComponent parent, string name, double width, double height) : base(parent)
    {
        _Name = name;
        _Width = width;
        _Height = height;
    }
}

序列化相关代码如下:

private void Run()
{
    try
    {
        concept = new Concept(null);

        concept.AddSubComponent(new Component(concept));

        byte[] serializedConcept = SerializerHelper.Serialize(concept);
        //Possible recursion detected (offset: 3 level(s)): Loop_Protobuf.Core_E.Part

        Concept concept2 = SerializerHelper.Deserialize<Concept>(serializedConcept);
    }
    catch (Exception ex)
    {

    }
}

工具类代码如下:

public static class SerializerHelper
{
    public static byte[] Serialize<T>(T source)
    {
        using (var stream = new MemoryStream())
        {
            Serializer.Serialize(stream, source);
            return stream.ToArray();
        }
    }

    public static T Deserialize<T>(byte[] source)
    {
        using (var stream = new MemoryStream(source))
        {
            return Serializer.Deserialize<T>(stream);
        }
    }
}

请问我哪里操作错误导致了这个异常?


内容的提问来源于stack exchange,提问作者Yannick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 23:03:24