2011-09-29 15 views
7

Próbowałem użyć protobuf-net z MonoTouch, ale nie mam pojęcia jak i pomimo usłyszenia, że ​​jest to możliwe, nie udało mi się znaleźć żadnego tutoriala ani żadnego przykładu, który faktycznie działa.protobuf-net v2 i Monotouch: jak się miesza?

Zostało to potwierdzone przez Marc Gravell on his blog, które działa na MonoTouch. Przejrzałem także blogi dwóch osób, o których wspomniał w tym artykule, ale nie znalazłem nic związanego z protobufem.

Nie mając potencjalnego klienta na ten temat, postanowiłem pobrać protobuf-net i spróbować go wypróbować. Stworzyłem więc następujący obiekt dla celów testowych:

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

    } 

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

i starałem się wysłać go przez WCF z usługi w systemie Windows za pomocą interfejsu [ServiceContract] z

[OperationContract] 
ProtoObject GetObject(); 

ale wystąpienie ProtoObject otrzymaliśmy na urządzenie ma zawsze wartość zerową. To nie jest tak naprawdę nieoczekiwane, ponieważ przeczytałem, że aby protobuf-net działał z WCF, musisz modify the app.config/web.config.

Jest to trochę trudne do osiągnięcia, ponieważ projekt MonoTouch nie ma aplikacji app.config, ale jeszcze się nie poddałem. Aby zastąpić app.config, starałem się programowo dodać protoEndpointBehavior do zachowań punktu końcowego klienta i tam uderzyłem w ścianę. ProtoBuf.ServiceModel.ProtoEndpointBehavior, dostępny w wersji protobuf-net .NET 3.0, nie jest dostępny w wersji na iOS.

W jaki sposób chciałbym użyć protobuf-net do deserializacji obiektów otrzymanych z punktu końcowego opartego na windowsie WCF przy użyciu serializacji protobuf-net.

Odpowiedz

6

Jest to właściwie to samo, co opisano w tej publikacji: blog entry by Friction Point Studios. Ponieważ meta-programowanie na urządzeniu nie jest tak naprawdę opcją, polega na wstępnym wygenerowaniu dll serializacji. Można to zrobić, tworząc mały plik exe konsoli (jest to tylko narzędzie - nie jest on zaprojektowany tak, aby był ładny), który konfiguruje numer RuntimeTypeModel (przez dodanie typów, które są zainteresowane), a następnie wywołanie .Compile(...):

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

Generuje to dll serializera; po prostu odwoływać się do tego dll (wraz z wersją iOS protobuf-net) i użyć typu serializer w dll do interakcji z modelu

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

Wystarczy przynieść to do tej pory nie kilka problemów ze stosowaniem WCF + Protobuf na MonoTouch. Jak zauważyłeś, obecne wersje System.ServiceModel i protobuf light dla ios nie zawierają wszystkich niezbędnych bitów.

Jeśli jednak przejdziesz do pełnego zestawu System.ServiceModel z wersji Mono repository on GitHub i zbudujesz go na pełnym Protobuf source, możesz go uruchomić; Tak zrobiłem.

Należy wygenerować zestaw do serializacji za pomocą narzędzia do kompilacji wstępnej, a następnie dokonać edycji atrybutu ProtoOperationBehavior w celu uzyskania odniesienia do zestawu do serializacji. Wszystkie zmiany są zbyt obszerne, aby je tutaj opisać, ale można to zrobić i jest to lot szybszy niż DatacontractSerializer, co jest dość okropne na iOS.