【问题标题】:Serializing an IEnumerable trough WCF using Protobuf-net and Monotouch for IOS使用 Protobuf-net 和 Monotouch for IOS 序列化 IEnumerable 槽 WCF
【发布时间】:2011-06-07 18:16:13
【问题描述】:

我正在尝试在 Monotouch/Monodevelop for IOS 上编写 WCF 服务。我对我的可序列化对象使用标准属性,例如 [DataMember]/[DataContract],对我的接口使用 [ServiceContract]/[OperationContract]。一切正常,但是当我尝试在接口实现(服务器端)上实现返回 IEnumerable 的方法时,它不起作用。

所以为了解决我的问题,我尝试使用最新版本的 protobuf-net,即 protobuf-net v2 beta r404。但我仍然收到来自 Protobuf-net 的序列化错误。请注意,“MyObject”中的 IEnumerable 序列化没有问题。

这是我的代码现在的样子:

我的对象:

[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作为属性,因为它不在protobuf的ISO dll中):

[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;
        }
    }

【问题讨论】:

  • 对不起,伙计! 'g' 在我的 qwerty 键盘上的 'f' 附近!
  • 我可能会在 iOS 构建中包含该属性 - 我只是因为 MonoTouch 上 WCF 状态的不确定性而省略了它。如果这行得通,那很好......

标签: c# wcf ienumerable protobuf-net serialization


【解决方案1】:

我怀疑应该可以为此调整数据合同序列化程序代码。我去看看。

现在:我的建议是返回一个具有 IEnumerable&lt;T&gt; 作为属性的明显具体类型。或者可能返回一个List&lt;T&gt;,这可能会起作用。

不过,支持这种情况听起来很合理。我会看看我能做什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多