protobuf-net v2和Monotouch:它是如何混合的?

时间:2011-09-29 18:23:08

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

我一直在尝试将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; }
}

我尝试通过WCF从使用[ServiceContract]界面的Windows上运行的服务发送它

[OperationContract]
ProtoObject GetObject();

但是在设备上收到的ProtoObject实例始终为null。这并不是真正意料之外的,因为我已经读到要使你需要modify the app.config/web.config使用WCF进行protobuf-net工作。

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

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

2 个答案:

答案 0 :(得分:6)

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

.Compile(...)

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

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

答案 1 :(得分:0)

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

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

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