首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MissingMethodException in Protobuf-net(v1) Serializer.Deserialize (.NET CF3.5)和设备挂起采用Serializer.DeserializeWithLengthPrefix方法

MissingMethodException in Protobuf-net(v1) Serializer.Deserialize (.NET CF3.5)和设备挂起采用Serializer.DeserializeWithLengthPrefix方法
EN

Stack Overflow用户
提问于 2012-02-15 08:39:03
回答 1查看 515关注 0票数 1

我正在使用Protobuf (v1 r282)在.NET CF3.5应用程序(客户端)和.NET 2.0 WebService中。

在客户机和服务器之间需要发送大量的数据(对于这个数据来说,protobuf-net在将通过网络发送的数据的时间/数量减少-将5-7分钟的传输时间缩短到只有25-30秒)方面非常出色)。

在对手持设备(CF3.5)中的MissingMethodException方法进行了大约13-15次调用之后,我得到了Serializer.Deserialize

StackTrace:

代码语言:javascript
复制
   at ProtoBuf.Property.PropertyFactory.Create[T](MemberInfo member)
   at ProtoBuf.Serializer`1.Build()
   at ProtoBuf.Serializer`1.DeserializeChecked[TCreation](SimpleWrapper& instance, SerializationContext source)
   at ProtoBuf.SerializerSimpleProxy`1.Deserialize(List`1& value, SerializationContext source)
   at ProtoBuf.Serializer.Deserialize[T](SerializationContext source)
   at ProtoBuf.Serializer.Deserialize[T](Stream source)
   at Lazurde.LazurdeDialogs.DLG_9600.DeserializeProtobufData[T](Byte[] protoArray)

如果我尝试使用Serializer.DeserializeWithLengthPrefix方法,大约。同样数量的调用----设备只挂起。更改调用顺序(首先或结束时进行更大的数据反序列化)没有什么区别。

我使用MemoryStream进行序列化/反序列化过程。

代码语言:javascript
复制
    public List<T> DeserializeProtobufData<T>(byte[] protoArray)
    {
        List<T> list = null;
        using (var stream = new MemoryStream(protoArray))
        {
            list = Serializer.DeserializeWithLengthPrefix<List<T>>(stream, PrefixStyle.Base128);
            //list = Serializer.Deserialize<List<T>>(stream);
            stream.Close();
        }
        return list ?? new List<T>();
    }

在流中为最大流指定的byte[] protoArray大约为。900 is数据是一个List<T>,其中T是包含简单值类型(以及string和DateTime)的对象。对象被指定为具体类型(而不是接口),并且没有任何继承层次结构。

如果Serializer.Serialize方法(大约。10次调用)在反序列化之前使用,如果首先使用大数据数组,则在使用3-4次调用后使用OutOfMemory异常,如果以后使用7-8次调用(但在大数据反序列化之前也不一定使用)。

这让我觉得我的应用程序中有某种内存泄漏,或者在使用protobuf反序列化时,大对象堆中有太多的碎片,但是我无法理解的是,当不使用protobuf时,它不会崩溃或抛出异常。(即在数据传输前等待大约10-15分钟,使用protobuf不到一分钟)。

在每次反序列化之后,我还尝试使用GC状态来查看它是否有帮助,但它似乎没有任何效果,这使我认为大对象堆的碎片太多了。

代码语言:javascript
复制
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

I正在分析内存,并试图找到问题区域,任何帮助都将是非常感谢的。为CF3.5推荐一个良好的mem分析器也会有帮助(目前正在使用.NETCF currently)。

数据在许多不同的集合中(大约有)。15用于向服务器发送客户端,20用于将服务器发送到客户端),3条(服务器到客户端)集合的大小约为10000条记录(在生产中可能增加到30000条),每条记录最多有45个字段。

对不起,这是一个如此大的帖子,但我认为它是最好提供更多的信息。而不是更少。

另外,CF3.5中是否有用于protobuf的v2?它不在r480的拉链里。

我们会非常感谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-15 12:15:59

是的,CF上的MissingMethodException是皇家皮塔,实际上是我编写了protobuf的全部核心的各种原因之一,基本上是从零开始的。

我认为这应该在v2中解决,因为它不会产生任何泛型/非泛型翻转。如果我不是为CF构建的,那么这只是一个疏忽(有点痛苦,但我需要使用不同的VM来构建CF版本)。它应该从源代码构建,否则,当我有时间时,我可以尝试做一个CF构建。

Re任何碎片:我不想猜测v1,因为我的建议是“切换到v2",而v2有一个非常不同的代码库。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9290149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档