protobuf-net v2 и Monotouch: как это сочетается? - PullRequest
7 голосов
/ 29 сентября 2011

Я пытался использовать protobuf-net с MonoTouch, но я понятия не имею, как, и, несмотря на то, что я слышал, что это возможно, я не смог найти ни одного учебного пособия или какого-либо примера, который действительно работает.

Марк Грэвелл подтвердил в своем блоге , что он работает на MonoTouch.Я также просмотрел блоги двух людей, о которых он говорит в этой статье, но я не нашел ничего, связанного с protobuf. * ​​1005 *

Не имея никаких сведений по этому вопросу, я решил скачать protobuf-net и попробоватьэто все равно.Поэтому я создал следующий объект для целей тестирования:

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

    }

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

и попытался отправить его через WCF из службы, работающей в Windows, используя интерфейс [ServiceContract] с

[OperationContract]
ProtoObject GetObject();

, ноэкземпляр ProtoObject, полученный на устройстве, всегда равен нулю.Это не совсем неожиданно, так как я прочитал, что для того, чтобы protobuf-net работал с WCF, вам нужно изменить app.config / web.config .

Это немного сложно сделать, так как в проекте MonoTouch нет app.config, но я еще не сдался.Чтобы заменить app.config, я попытался программно добавить ProtoEndpointBehavior к поведению конечной точки клиента, и там я столкнулся со стеной.ProtoBuf.ServiceModel.ProtoEndpointBehavior, доступный в .NET 3.0 Реализация protobuf-net недоступна в выпуске iOS.

Как мне использовать protobuf-net для десериализации объектов, полученных из оконечной точки WCF на основе Windowsиспользуя сериализацию protobuf-net.

Ответы [ 2 ]

6 голосов
/ 30 сентября 2011

На самом деле это почти то же самое, что описано в этой записи в блоге 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
0 голосов
/ 13 июня 2014

Просто, чтобы обновить это, есть несколько проблем с использованием WCF + Protobuf в MonoTouch.Как вы уже видели, текущие выпуски System.ServiceModel и protobuf light для ios не включают в себя все необходимые биты.

Однако если вы идете и получаете полный System.ServiceModel из Mono-репозитория на GitHub и собираете его из полного источника Protobuf , то вы можете заставить его работать;Я сделал это.

Вам необходимо сгенерировать сборку сериализации с помощью инструмента предварительной компиляции, а затем отредактировать атрибут ProtoOperationBehavior, чтобы он каким-то образом ссылался на вашу сборку сериализации.Все изменения слишком обширны, чтобы документировать их здесь, но это можно сделать, и это на много быстрее, чем DatacontractSerializer, который довольно ужасен для iOS.

...