protobuf-net v2 и Monotouch: как это сочетается?

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

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

Не имея никаких сведений по этому вопросу, я решил загрузить 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.


person Louis Boux    schedule 29.09.2011    source источник


Ответы (2)


На самом деле это почти то же самое, что описано в этом запись в блоге Friction Point Studios. Поскольку метапрограммирование на устройстве на самом деле не вариант, уловка состоит в том, чтобы предварительно сгенерировать dll сериализации. Это можно сделать, создав небольшой исполняемый файл консоли (это всего лишь инструмент - он не предназначен для того, чтобы быть красивым), который настраивает RuntimeTypeModel (добавляя типы, которые вас интересуют), а затем вызывает .Compile(...):

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

Это генерирует dll сериализатора; просто укажите эту dll (вместе с версией protobuf-net для iOS) и используйте тип сериализатора в dll для взаимодействия с вашей моделью:

var ser = new MySerializer();
ser.Serialize(dest, obj); // etc
person Marc Gravell    schedule 30.09.2011

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

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

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

person MarkDaniel    schedule 13.06.2014