Сериализация IEnumerable через WCF с использованием Protobuf-net и Monotouch для IOS

Я пытаюсь кодировать службу WCF на Monotouch / Monodevelop для IOS. Я использовал стандартные атрибуты, такие как [DataMember] / [DataContract] для моего сериализуемого объекта и [ServiceContract] / [OperationContract] для моего интерфейса. Все работало нормально, но когда я попытался реализовать метод, возвращающий IEnumerable в реализации интерфейса (на стороне сервера), это не сработало.

Итак, чтобы решить свою проблему, я попытался использовать последнюю версию protobuf-net, которая является protobuf-net v2 beta r404. Но я все еще получаю ошибку сериализации от Protobuf-net. Обратите внимание, что IEnumerable в MyObject сериализуется без проблем.

Вот как сейчас выглядит мой код:

MyObject:

[ProtoContract]
public class MyObject
{
    public MyObject ()
    {
    }

    [ProtoMember(1)]
    public int Id {get;set;}

    [ProtoMember(2)]
    public IEnumerable<MyObject> myObjects {get;set;}
}

Мой интерфейс (на стороне сервера в Windows):

[ServiceContract]
public interface ITouchService
{
        [OperationContract, ProtoBehavior]
        MyObject Execute();

    [OperationContract, ProtoBehavior]
    IEnumerable<MyObject> ExecuteENUM ();
}

Мой интерфейс (клиентская сторона на IOS, я не могу добавить ProtoBehavior в качестве атрибута, потому что его нет в ISO dll protobuf):

[ServiceContract]
public interface ITouchService
{
    [OperationContract]
    MyObject Execute();

    [OperationContract]
    IEnumerable<MyObject> ExecuteENUM ();
}

Моя реализация интерфейса:

public class TouchService : ITouchService
    {
        public MyObject Execute()
        {
            var myObject = new MyObject() { Id = 9001 };

            var myList = new List<MyObject>();

            for (int i = 0; i < 10; i++)
            {
                myList.Add(new MyObject() { Id = i });
            }

// Will serialize
            myObject.myObjects = myList;

            return myObject;

        }

        public IEnumerable<MyObject> ExecuteENUM()
        {
            var myEnum = new List<MyObject>();

            for (int i = 0; i < 10; i++)
            {
                myEnum.Add(new MyObject() { Id = i });
            }

            return myEnum;
        }
    }

person Jean-Philippe Leclerc    schedule 07.06.2011    source источник
comment
Извини чувак! буква «g» находится рядом с буквой «f» на моей qwerty-клавиатуре!   -  person Jean-Philippe Leclerc    schedule 07.06.2011
comment
Вероятно, я могу включить этот атрибут в сборку iOS - я пропустил его только из-за неопределенности в отношении состояния WCF на MonoTouch. Если это сработает, хорошо ...   -  person Marc Gravell    schedule 07.06.2011


Ответы (1)


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

А пока: я бы посоветовал вернуть очевидный конкретный тип, который имеет IEnumerable<T> в качестве свойства. Или, может быть, вместо этого верните List<T>, что может сработать.

Однако кажется разумным поддержать этот сценарий. Я посмотрю что я могу сделать.

person Marc Gravell    schedule 07.06.2011