У меня есть встроенное приложение C#, использующее серию передачи protobuf-net. При сериализации коллекции из примерно 50 записей она генерирует исключение StackOverflowException, воспроизводимое только на устройстве, которое запускает WinCE. Стек около 600 записей глубокий и заканчивается так:protobuf-net collection serialization throws StackOverflowException
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 с большим количеством ресурсов.
Есть ли возможность оптимизировать сериализацию? Я что-то не так?
Почему так много вызовов? Я предположил, что список следует рассматривать последовательно как массив, а не рекурсивными вызовами?
Спасибо, Daiana
Что делает 'GraphNode' похожим? Это действительно какая-то рекурсивная структура данных? Действительно ли 'NodeList ' содержит сложное дерево или граф объектов? –
dbc
Да, это может быть довольно сложная структура, но не содержит дерева или графа. Кроме того, стандартная серализация XML отлично работает. –