我一直在尝试将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端点接收的对象进行反序列化。
答案 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上非常糟糕。