Как правильно перейти с WCF DatacontractSerializer на Protobuf-net? - PullRequest
5 голосов
/ 05 августа 2011

У нас огромное приложение с множеством классов.В настоящее время мы переносим это приложение .net на IPad с Monotouch.У нас есть некоторые проблемы с DataContractSerializer, и мы хотели бы использовать сериализатор protobuf-net от Marc Gravell.

Связь между клиентом и сервером управляется службой WCF.

Служба WCFсостоит из одного интерфейса, доступного клиенту и серверу, и одной реализации этого интерфейса на сервере.

Интерфейс выглядит следующим образом:

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    SomeObject MyFunction(SomeObject myObject);
}

Реализация на стороне сервера выглядит следующим образомчто:

[ServiceBehavior(...)]
public class MyService
{
    public SomeObject MyFunction(SomeObject myObject)
    {
    }
}

Наши классы выглядят так:

[DataContract]
public class MyClass
{
    [DataMember]
    public int SomeProp {get; set;}

    [OnSerialized]
    public void OnSerialized(StreamingContext context)
    {
    }
}

Итак, вот мои вопросы:

  • Какие будут изменения вделать с моими классами, интерфейсом wcf и реализацией wcf.

  • Как заменить стандартный WCF DataContractSerializer на Serializer Protobuf. * ​​1024 *

Обратите вниманиечто в monotouch у меня есть доступ только к пространствам имен Protobuf и Protobuf.Meta.

[EDIT] Я нашел способ поменять среду выполнения сериализатора: Пользовательский WCF DataContractSerializer

Приведенное выше решение использует DataContractSerializerOperationBehavior.Protobuf-net обеспечивает такое поведение?

1 Ответ

2 голосов
/ 05 августа 2011

Честно говоря, я не знаком с вариантами WCF, доступными вам в monmotouch; например, они сильно различаются между обычными .NET и Silvelight - и я не вижу оснований предполагать, что monotouch имеет возможность менять сериализатор во время выполнения (что делает «полный» .NET, по крайней мере, в версии MS). Это затрудняет тихий переход , поскольку мы не можем вырвать управление из DataContractSerializer.

Таким образом, IMO самый простой вариант - захватить контроль над данными вручную и отправлять необработанные byte[] - в идеале с включенным кодированием MTOM, если это можно сделать с помощью monotouch. Затем, когда у вас есть byte[], мир, как говорится, является вашим моллюском.

Ре изменения в ваших типах ... ну, MyFunction() - это странность, поскольку он не передает никаких данных, поэтому я не уверен, что вы хотите, чтобы я предложил по этому поводу. С MyClass все, что ему нужно, - это уникальный номер (уникальный в пределах типа, а не глобально) для каждого члена, т.е.

[DataContract]
public class MyClass
{
    [DataMember(Order=1)] // <==== this provides the 1 as the key
    public int SomeProp {get; set;}

    // see below re callback
}

У вас также есть обратный вызов сериализации; они полностью поддерживаются, но он ожидает найти знакомый шаблон - StreamContext - не тот, который мне известен (хотя он должен работать с StreamingContext и некоторыми другими). ​​

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

[DataContract(SkipConstructor=true)]
public class MyClass {...}

Если я пропустил намерение, дайте мне знать.

Обратите внимание, что есть также способы сделать всю конфигурацию без изменения / добавления каких-либо атрибутов, если вы предпочитаете.

...