2011-09-29 5 views
7

He estado tratando de usar protobuf-net con MonoTouch pero no tengo idea de cómo, y a pesar de haber escuchado que es posible, no he podido encontrar ningún tutorial o ningún ejemplo que realmente funcione.protobuf-net v2 y Monotouch: ¿Cómo se mezcla?

Marc Gravell confirmó on his blog que funciona en MonoTouch. También busqué en los blogs de las dos personas que menciona en este artículo, pero no encontré nada relacionado con protobuf.

Sin tener ninguna ventaja sobre el tema, decidí descargar protobuf-net y probarlo de todos modos. Así que creé el siguiente objeto para propósitos de prueba:

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

    } 

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

y traté de enviarlo a través de WCF de un servicio que se ejecuta en Windows utilizando una interfaz [ServiceContract] con

[OperationContract] 
ProtoObject GetObject(); 

pero la instancia de ProtoObject recibidas en el dispositivo siempre es nulo. Esto no es realmente inesperado ya que he leído que para hacer que el trabajo de protobuf-net con WCF necesite modify the app.config/web.config.

Es un poco difícil de lograr ya que un proyecto MonoTouch no tiene app.config, pero aún no me di por vencido. Para reemplazar el app.config, intenté agregar ProtoEndpointBehavior a los comportamientos del punto final del cliente mediante programación, y allí choqué contra un muro. ProtoBuf.ServiceModel.ProtoEndpointBehavior, disponible en la implementación .NET 3.0 de protobuf-net no está disponible en la versión de iOS.

¿Cómo me iría con el uso de protobuf-net para deserializar los objetos recibidos desde un punto final WCF basado en Windows utilizando serialización protobuf-net.

Respuesta

6

En realidad, es prácticamente lo mismo que se describe en este blog entry by Friction Point Studios. Como la metaprogramación en el dispositivo no es realmente una opción, el truco es pregenerar una dll de serialización. Esto se puede hacer mediante la creación de una pequeña consola exe (esto es sólo una herramienta - que no está diseñado para ser bastante) que configura un RuntimeTypeModel (mediante la adición de los tipos que le interesan), y luego llamar .Compile(...):

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

Esto genera un serializador dll; simplemente hacer referencia a esta DLL (junto con la versión de IOS protobuf-net), y utilizar el tipo de serializador en la DLL de interactuar con su modelo:

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

Sólo para llevar esto hasta la fecha hay algunos problemas con el uso de WCF + Protobuf en MonoTouch. Como ha observado, las versiones actuales de System.ServiceModel y protobuf light for ios no incluyen todos los bits necesarios.

Sin embargo, si obtiene el System.ServiceModel completo del Mono repository on GitHub y lo compila con el Protobuf source completo, puede hacerlo funcionar; Lo he hecho.

Debe generar un conjunto de serialización utilizando la herramienta de precompilación y luego edite el atributo ProtoOperationBehavior para darle una forma de hacer referencia al conjunto de serialización. Todos los cambios son demasiado extensos para documentar aquí, pero se puede hacer y es un lote más rápido que DatacontractSerializer, que es bastante horrible en iOS.