【发布时间】:2016-03-17 16:23:28
【问题描述】:
我有一个使用 protobuf-net 序列化的嵌入式 C# 应用程序。 当序列化大约 50 个条目的集合时,它会引发 StackOverflowException,只能在运行 WinCE 的设备上重现。 堆栈大约有 600 个条目,并以如下方式结束:
at ProtoBuf.Meta.RuntimeTypeModel.GetKey(Type type, Boolean demand, Boolean getBaseKey)
at ProtoBuf.Meta.ValueMember.TryGetCoreSerializer(RuntimeTypeModel model, DataFormat dataFormat, Type type, WireType& defaultWireType, Boolean asReference, Boolean dynamicType, Boolean overwriteList, Boolean allowComplexTypes)
at ProtoBuf.Meta.ValueMember.BuildSerializer()
at ProtoBuf.Meta.ValueMember.get_Serializer()
at ProtoBuf.Meta.MetaType.BuildSerializer()
at ProtoBuf.Meta.MetaType.get_Serializer()
at ProtoBuf.Meta.RuntimeTypeModel.Serialize(Int32 key, Object value, ProtoWriter dest)
at ProtoBuf.ProtoWriter.WriteObject(Object value, Int32 key, ProtoWriter writer)
at ProtoBuf.Serializers.SubItemSerializer.ProtoBuf.Serializers.IProtoSerializer.Write(Object value, ProtoWriter dest)
at ProtoBuf.Serializers.TagDecorator.Write(Object value, ProtoWriter dest)
at ProtoBuf.Serializers.PropertyDecorator.Write(Object value, ProtoWriter dest)
at ProtoBuf.Serializers.TypeSerializer.Write(Object value, ProtoWriter dest)
at ProtoBuf.Meta.RuntimeTypeModel.Serialize(Int32 key, Object value, ProtoWriter dest)
at ProtoBuf.ProtoWriter.WriteObject(Object value, Int32 key, ProtoWriter writer)
at ProtoBuf.BclHelpers.WriteNetObject(Object value, ProtoWriter dest, Int32 key, NetObjectOptions options)
at ProtoBuf.Serializers.NetObjectSerializer.Write(Object value, ProtoWriter dest)
at ProtoBuf.Serializers.TagDecorator.Write(Object value, ProtoWriter dest)
at ProtoBuf.Serializers.FieldDecorator.Write(Object value, ProtoWriter dest)
at ProtoBuf.Serializers.TypeSerializer.Write(Object value, ProtoWriter dest)
at ProtoBuf.Meta.RuntimeTypeModel.Serialize(Int32 key, Object value, ProtoWriter dest)
at ProtoBuf.ProtoWriter.WriteObject(Object value, Int32 key, ProtoWriter writer)
at ProtoBuf.Serializers.SubItemSerializer.ProtoBuf.Serializers.IProtoSerializer.Write(Object value, ProtoWriter dest)
at ProtoBuf.Serializers.TagDecorator.Write(Object value, ProtoWriter dest)
at ProtoBuf.Serializers.ListDecorator.Write(Object value, ProtoWriter dest)
at ProtoBuf.Serializers.PropertyDecorator.Write(Object value, ProtoWriter dest)
at ProtoBuf.Serializers.TypeSerializer.Write(Object value, ProtoWriter dest)
at ProtoBuf.Meta.RuntimeTypeModel.Serialize(Int32 key, Object value, ProtoWriter dest)
at ProtoBuf.ProtoWriter.WriteObject(Object value, Int32 key, ProtoWriter writer)
at ProtoBuf.BclHelpers.WriteNetObject(Object value, ProtoWriter dest, Int32 key, NetObjectOptions options)
at ProtoBuf.Serializers.NetObjectSerializer.Write(Object value, ProtoWriter dest)
列表定义如下:
[ProtoMember(2, AsReference = true, DataFormat = DataFormat.Group)]
//[ProtoMember(2, AsReference = true)]
public NodeList<T> Nodes { get; private set; }
(我尝试了两个版本,有和没有 DataFormat.Group)
[ProtoContract(ImplicitFields = ImplicitFields.AllFields)]
public class NodeList<T> : Collection<GraphNode<T>> where T : new()
在具有更多资源的 Windows 7 上运行应用程序时不会引发异常。
有没有可能优化序列化? 我是不是做错了什么?
为什么调用栈这么长?我认为一个列表应该被视为一个数组,而不是递归调用?
谢谢, 戴安娜
【问题讨论】:
-
GraphNode<T>看起来像什么?它实际上是某种递归数据结构吗?NodeList<T>实际上是否包含复杂的树或对象图? -
是的,它可以是一个非常复杂的结构,但不包含树或图。此外,XML 的标准序列化工作正常。
标签: c# serialization windows-ce protobuf-net