我正在使用Protobuf (v1 r282)在.NET CF3.5应用程序(客户端)和.NET 2.0 WebService中。
在客户机和服务器之间需要发送大量的数据(对于这个数据来说,protobuf-net在将通过网络发送的数据的时间/数量减少-将5-7分钟的传输时间缩短到只有25-30秒)方面非常出色)。
在对手持设备(CF3.5)中的MissingMethodException方法进行了大约13-15次调用之后,我得到了Serializer.Deserialize:
StackTrace:
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进行序列化/反序列化过程。
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状态来查看它是否有帮助,但它似乎没有任何效果,这使我认为大对象堆的碎片太多了。
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
I正在分析内存,并试图找到问题区域,任何帮助都将是非常感谢的。为CF3.5推荐一个良好的mem分析器也会有帮助(目前正在使用.NETCF currently)。
数据在许多不同的集合中(大约有)。15用于向服务器发送客户端,20用于将服务器发送到客户端),3条(服务器到客户端)集合的大小约为10000条记录(在生产中可能增加到30000条),每条记录最多有45个字段。
对不起,这是一个如此大的帖子,但我认为它是最好提供更多的信息。而不是更少。
另外,CF3.5中是否有用于protobuf的v2?它不在r480的拉链里。
我们会非常感谢你的帮助。
发布于 2012-02-15 12:15:59
是的,CF上的MissingMethodException是皇家皮塔,实际上是我编写了protobuf的全部核心的各种原因之一,基本上是从零开始的。
我认为这应该在v2中解决,因为它不会产生任何泛型/非泛型翻转。如果我不是为CF构建的,那么这只是一个疏忽(有点痛苦,但我需要使用不同的VM来构建CF版本)。它应该从源代码构建,否则,当我有时间时,我可以尝试做一个CF构建。
Re任何碎片:我不想猜测v1,因为我的建议是“切换到v2",而v2有一个非常不同的代码库。
https://stackoverflow.com/questions/9290149
复制相似问题