我的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成功传递列表而不破坏封装(我不想暴露通用列表)?
答案 0 :(得分:1)
如果不直接亲自尝试,我相信你肯定是正确的。
.NET中的序列化使得只读属性成为一个有趣的马戏团。因为.net默认序列化过程需要一个setter属性才能“反序列化”对象。如果没有setter属性,序列化部分仍然可以工作,允许您序列化到驱动器或网络。但是,反序列化过程将失败,这肯定是您的集合为空的原因。我只是感到惊讶,说实话并没有错误。您是否尝试添加一个简单的setter来验证这实际上是问题,以便我们在解决问题之前100%确定这是问题所在。
答案 1 :(得分:1)
虽然我从未真正解决过最初的问题,但我所做的工作是简化传递给Web方法的数据。我没有将整个对象传递给Web方法,而是传递了一个唯一的标识符。 webmethod然后返回我需要的列表,我处理实际上将此列表中的项添加到对象客户端。
答案 2 :(得分:0)
ASMX服务使用的XML Serializer仅序列化公共读/写属性。