2010-09-09 64 views
1

我尝试在WCF/Silverlight应用程序中使用protobuf-net来提高大对象数组的序列化性能。我可以在服务代码中序列化/反序列化类(添加Order =等)。如何在Silverlight WCF生成的服务中使用protobuf-net

但是,当我尝试应用ProtoBehavior并从Silverlight调用启用protobuf的服务方法时,我得到空值而不是数据(或错误)。

我想这是因为:

  1. ProtoBehavior是失去了在Silverlight中生成的服务代码;
  2. 域类(类型)不在重用的程序集中,它们在客户端重新生成,并且Order =丢失。

但是目前我无法改变这两点。有没有一种方法可以使用protobuf-net而不重构(相当大)的项目,以便与域类共享ASP.NET/Silverlight组件?

我甚至认为如果没有其他解决方案来调整Reference.cs以添加缺少的行为和Order =到适当的成员(通过perl/regex脚本)会更容易,但是我需要调整什么,以及它会起作用吗?

回答

1

Re [ProtoBehavior],Silverlight很简单,缺少我们可以用来默认的扩展点向WCF注入一个替代的序列化器,这是一个痛苦。用silverlight做这个目前的唯一方法是通过导线抛出byte[]Stream,并处理两端的序列化/反序列化。

Re Order=...,这将是值得检查的内容;如果他们想出不同的号码,有办法通过partial class来解决这个问题 - 一个丑陋的黑客,但是IIRC有ProtoPartialMember(或类似的),可以应用于,但是会谈到一个单独的成员属性/字段)。您可以通过这种方式更正号码。在[ProtoContract]上也有Offset(IIRC,对不起 - 无需代码)帮助如果您有大量字段。

在第2版(未发布)中,您可以更好地控制排序(/字段编号),而不必混淆属性。

+0

对,由于某种原因生成Order =仅在生成的reference.cs类中的第一个属性上丢失,所有其他人都拥有它,但是偏移量为-1。很奇怪。但现在通过解决这个问题并通过线路发送字节[],我可以恢复我的数据。所以,在Silverlight中没有办法使用ProtoBehavior,必须坚持byte []?没什么大不了的,但仍然...因为类型产生了,这将需要额外的努力来强制类生成,等等。 – queen3 2010-09-09 10:06:31

+0

@ queen3 - 不是我所知道的。不过,我确实知道有人(不是我)在C#的RPC上做了很多工作;也许这将在Silverlight中作为WCF的替代*工作?我还没有时间玩它呢。 – 2010-09-09 11:33:01