我一直在尝试使用带有MonoTouch的protobuf-net,但我不知道如何,尽管听说有可能,但我还是找不到任何教程或任何实际工作的例子. Marc Gravell on his blog确认它可以在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端点接收的对象进行反序列化.
它实际上与此 blog entry by Friction Point Studios中描述的几乎相同.由于设备上的元编程实际上不是一个选项,诀窍是预生成序列化dll.这可以通过创建一个小的控制台exe(这只是一个工具 – 它不是很漂亮)来配置RuntimeTypeModel(通过添加你感兴趣的类型),然后调用.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