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
相关产品推荐
相关产品推荐

