丢失作为另一个对象的属性传递给Web服务的集合对象

时间:2013-12-19 19:18:11

标签: c# asp.net .net web-services collections

我有一个非常复杂的ASP.Net网络服务,我不得不开发。以下是我撰写的示例代码。

首先,我有一个Web服务方法,它将List作为参数。

[WebMethod] public AppResults SyncObjectToServer(string appID,List updates)

WSExecCommand是我定义的一个包含多个List对象的类。这是WSExecCommand的简单版本。

[Serializable] public class WSExecCommand
{
    public string Command;

    [XmlIgnore] public Dictionary<string, MyKeyValuePair> __ParentKey;
    [XmlArray] public List<MyKeyValuePair> ParentKey
    { 
        get
        {
            if (__ParentKey == null)
                __ParentKey = new Dictionary<string, MyKeyValuePair>;
            return new List<KeyValuePair>(__ParentKey.Values); 
        }
        set
        {
            __ParentKey.Clear();
            foreach (MyKeyValuePair kvp in value)
                __ParentKey.Add(kvp.Key, kvp);
        }
    }
}

如果您想知道为什么我这样设置我的课程,问题是ASP.Net不允许您返回或接收Dictionary对象。我真的需要将ParentKey对象作为字典。但是,为了解决ASP.Net的限制,我创建了上面的包装器属性来获取和设置我在代码中引用的基础Dictionary的值。

我的问题是,当我从我的消费应用程序调用我的Web服务方法时,__ParentKey永远不会填充传递给服务器的数据。

我已经进入了Web服务代码,我收到了一个已填充的List<WSExecCommand>集合。但是,对于列表中的每个WSExecCommand,所有List<T>类型对象都有0个项目。

如何解决此问题?

1 个答案:

答案 0 :(得分:1)

get
{
    if (__ParentKey == null)
        __ParentKey = new Dictionary<string, MyKeyValuePair>;
    return new List<KeyValuePair>(__ParentKey.Values); 
}

在这里看起来你正在将__ParentKey设置为一个新的Dictionary,然后在该字典中返回KeyValuePairs的列表,当你第一次调用它时它当然是空的。由于您已选择不序列化__ParentKey(因为字典不可序列化,因此无法序列化),当在线路的另一端反序列化WSExecCommand的实例时,__ParentKey 1}}为null(这在您第一次尝试访问该属性时会产生一个空列表。)

修改

有可能像你期望的那样在反序列化时调用setter。但是,如果是这种情况,那么您的问题很可能是__ParentKey在构造对象时为空,并且在您第一次调用getter之前不会实例化。我不相信在反序列化期间会调用你的getter,因此你的字典实例永远不会被创建。尝试预先构建你的字典,这样你就可以从你的getter中删除null检查。

[Serializable] public class WSExecCommand
{
    public string Command;

    [XmlIgnore] public Dictionary<string, MyKeyValuePair> __ParentKey = 
         new Dictionary<string, MyKeyValuePair>();
    [XmlArray] public List<MyKeyValuePair> ParentKey
    { 
        get
        {
            return new List<KeyValuePair>(__ParentKey.Values); 
        }
        set
        {
            __ParentKey.Clear();
            foreach (MyKeyValuePair kvp in value)
                __ParentKey.Add(kvp.Key, kvp);
        }
    }
}