wcf - protobuf-net v2 y Monotouch: ¿Cómo se mezcla?
xamarin.ios protocol-buffers (2)
He intentado 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.
Marc Gravell confirmó en su 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.
Al no tener ninguna ventaja sobre el tema, decidí descargar protobuf-net y probarlo de todos modos. Así que creé el siguiente objeto para fines de prueba:
[ProtoContract]
public class ProtoObject
{
public ProtoObject()
{
}
[ProtoMember(1)]
public byte[] Bytes { get; set; }
}
e intenté enviarlo a través de WCF desde un servicio que se ejecuta en Windows utilizando una interfaz [ServiceContract]
con
[OperationContract]
ProtoObject GetObject();
pero la instancia de ProtoObject recibida en el dispositivo siempre es nula. Esto no es realmente inesperado ya que he leído que para hacer que el trabajo de protobuf-net con WCF necesite modificar el 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 voy a usar protobuf-net para deserializar los objetos recibidos desde un punto final WCF basado en Windows utilizando la serialización protobuf-net?
En realidad, es bastante parecido a lo descrito en esta entrada de blog por Friction Point Studios . Como la meta-programación en el dispositivo no es realmente una opción, el truco es pregenerar una dll de serialización. Esto se puede hacer creando un pequeño administrador de consola (esta es solo una herramienta, no está diseñada para ser bonita) que configura un RuntimeTypeModel
(agregando los tipos que le interesan) y luego llama a .Compile(...)
var model = TypeModel.Create();
model.Add(typeof (ProtoObject), true);
model.Compile("MySerializer", "MySerializer.dll");
Esto genera un serializador dll; simplemente haga referencia a este dll (junto con la versión de iOS de protobuf-net) y use el tipo de serializador en el dll para interactuar con su modelo:
var ser = new MySerializer();
ser.Serialize(dest, obj); // etc
Para actualizar esto, existen 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 repositorio Mono en GitHub y lo compila contra la fuente completa de Protobuf , puede hacer que funcione; Lo he hecho.
Debe generar un ensamblaje de serialización utilizando la herramienta de precompilación y luego edite el atributo ProtoOperationBehavior para darle una forma de referenciar su ensamblaje de serialización. Todos los cambios son demasiado extensos para documentar aquí, pero se puede hacer y es mucho más rápido que DataContractSerializer, que es bastante horrible en iOS.