Я пытаюсь закодировать службу 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 ();
}
Myинтерфейс (на стороне клиента на IOS, я не могу добавить ProtoBehavior в качестве атрибута, потому что его нет в dll ISO 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;
}
}