【问题标题】:protobuf-net v2 and Monotouch : How does it mix?protobuf-net v2 和 Monotouch:它是如何混合的?
【发布时间】:2011-09-29 18:23:08
【问题描述】:

我一直在尝试将 protobuf-net 与 MonoTouch 一起使用,但我不知道如何使用,尽管听说有可能,但我找不到任何教程或任何实际工作的示例。

Marc Gravell on his blog 证实它确实适用于 MonoTouch。我也浏览了他在这篇文章中所说的两个人的博客,但我没有找到任何与 protobuf 相关的内容。

在这个主题上没有任何线索,我决定下载 protobuf-net 并尝试一下。所以我创建了以下对象用于测试目的:

[ProtoContract]
public class ProtoObject
{
    public ProtoObject()
    {

    }

    [ProtoMember(1)]
    public byte[] Bytes { get; set; }
}

我尝试使用带有[ServiceContract] 接口的 Windows 上运行的服务通过 WCF 发送它

[OperationContract]
ProtoObject GetObject();

但设备上收到的 ProtoObject 实例始终为空。这并不出人意料,因为我已经读过要使 protobuf-net 与 WCF 一起工作,您需要 modify the app.config/web.config

由于 MonoTouch 项目没有 app.config,这有点难以完成,但我还没有放弃。为了替换 app.config,我尝试以编程方式将 ProtoEndpointBehavior 添加到客户端端点的行为中,结果我碰壁了。 ProtoBuf.ServiceModel.ProtoEndpointBehavior,可用于 .NET 3.0 的 protobuf-net 实现,但在 iOS 版本中不可用。

我将如何使用 protobuf-net 反序列化从使用 protobuf-net 序列化的基于 Windows 的 WCF 端点接收的对象。

【问题讨论】:

    标签: wcf xamarin.ios protocol-buffers protobuf-net


    【解决方案1】:

    实际上与blog entry by Friction Point Studios 中描述的几乎相同。由于在设备上进行元编程 并不是一个真正的选择,因此诀窍是预先生成一个序列化 dll。这可以通过创建一个配置RuntimeTypeModel(通过添加您感兴趣的类型)的小型控制台exe(这只是一个工具 - 它并不是设计得漂亮)来完成,然后调用.Compile(...)

    var model = TypeModel.Create();
    model.Add(typeof (ProtoObject), true);
    model.Compile("MySerializer", "MySerializer.dll");
    

    这会生成一个序列化程序 dll;只需引用此 dll(连同 iOS 版本的 protobuf-net),并使用 dll 中的序列化程序类型与您的模型进行交互:

    var ser = new MySerializer();
    ser.Serialize(dest, obj); // etc
    

    【讨论】:

      【解决方案2】:

      为了更新这一点,在 MonoTouch 上使用 WCF + Protobuf 存在一些问题。正如您所观察到的,iOS 的 System.ServiceModel 和 protobuf light 的当前版本不包含所有必要的位。

      但是,如果您从 Mono repository on GitHub 获取完整的 System.ServiceModel 并针对完整的 Protobuf source 构建它,那么您可以让它工作;我已经这样做了。

      您需要使用预编译工具生成一个序列化程序集,然后编辑 ProtoOperationBehavior 属性为其提供一些方法来引用您的序列化程序集。所有更改都过于广泛,无法在此处记录,但可以完成,而且它比在 iOS 上非常糟糕的 DatacontractSerializer 快很多

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-19
        相关资源
        最近更新 更多