【问题标题】:How do I use protobuf-net in Silverlight WCF generated service如何在 Silverlight WCF 生成的服务中使用 protobuf-net
【发布时间】:2010-09-09 08:22:20
【问题描述】:

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

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

我认为这是因为:

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

但是目前我无法更改这两点。有没有一种方法可以使用 protobuf-net 而无需重构(相当大的)项目以与域类等共享 ASP.NET/Silverlight 程序集?

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

【问题讨论】:

    标签: silverlight wcf protobuf-net


    【解决方案1】:

    Re [ProtoBehavior],Silverlight 完全缺少我们可以用来静默将替代序列化程序注入 WCF 的扩展点,这很痛苦。 目前使用 silverlight 执行此操作的唯一方法是将byte[]Stream 放在网络上,并在两端处理序列化/反序列化。

    回复Order=...,内容值得一看;如果他们想出不同的数字,有办法通过 partial class 解决这个问题 - 一个丑陋的黑客,但 IIRC 有 ProtoPartialMember (或类似的)可以应用于 ,但它谈论的是单个成员(属性/字段)。您可以通过这种方式更正数字。 [ProtoContract] 上还有一个 Offset(IIRC,抱歉 - 没有代码可用),如果您有大量字段,它可以提供帮助。

    在 v2(未发布)中,您可以更好地控制排序(/字段编号),而不必弄乱属性。

    【讨论】:

    • 对,由于某种原因,生成的 Order= 仅在生成的 reference.cs 类中的第一个属性上丢失,所有其他属性都有它,但偏移量为 -1。很奇怪。但是现在通过解决这个问题并通过网络发送 byte[],我可以取回我的数据。那么,在 Silverlight 中没有办法使用 ProtoBehavior,必须坚持使用 byte[]?没什么大不了的,但仍然......因为类型是生成的,这将需要额外的努力来强制生成类,等等。
    • @queen3 - 我不知道。然而,我确实知道有人(不是我)在 C# 的 RPC 上做了很多工作。也许这将在 Silverlight 中作为 WCF 的替代方法工作?我还没有时间玩它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多