我有一个非常复杂的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个项目。
如何解决此问题?
答案 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);
}
}
}