在Web服务中序列化封装列表

时间:2011-03-31 20:46:53

标签: c# serialization soap asmx

我的class MyClass包含private List<MySecondClass> myList。该列表通过getter公开,如下所示:

public IEnumerable<MySecondClass> MyList
{
    get { return myList.Select(a => a); }
}

该列表通过公开AddItem(MySecondClass itemToAdd)ClearItems()方法进行修改。我相信这是一个适当的封装列表。

问题在于我需要通过SOAP将类型为MyClass(包含myList)的对象传递给Web服务,该服务填充myList(使用AddItem()方法),然后返回对象。

但是,当webmethod返回类时,序列化后myList为空。我怀疑这是因为我没有myList的setter,这导致在序列化期间不设置列表。

这是一个很好的假设,还是我离开了?如果问题是我认为的问题,有没有办法允许从webmethod成功传递列表而不破坏封装(我不想暴露通用列表)?

3 个答案:

答案 0 :(得分:1)

如果不直接亲自尝试,我相信你肯定是正确的。

.NET中的序列化使得只读属性成为一个有趣的马戏团。因为.net默认序列化过程需要一个setter属性才能“反序列化”对象。如果没有setter属性,序列化部分仍然可以工作,允许您序列化到驱动器或网络。但是,反序列化过程将失败,这肯定是您的集合为空的原因。我只是感到惊讶,说实话并没有错误。

您是否尝试添加一个简单的setter来验证这实际上是问题,以便我们在解决问题之前100%确定这是问题所在。

答案 1 :(得分:1)

虽然我从未真正解决过最初的问题,但我所做的工作是简化传递给Web方法的数据。我没有将整个对象传递给Web方法,而是传递了一个唯一的标识符。 webmethod然后返回我需要的列表,我处理实际上将此列表中的项添加到对象客户端。

答案 2 :(得分:0)

ASMX服务使用的XML Serializer仅序列化公共读/写属性。