ASP.NET Web服务忽略[NonSerialized]挂钩

时间:2013-03-22 05:30:06

标签: c# asp.net serialization soap

我正在尝试使用C#在ASP.NET中实现SOAP服务,因此我可以使用Flex来使用它 - 但这是下一步。我遇到的问题是我正在尝试与XmlNamespaceManager类中具有[Serializable]字段的服务器端类进行通信:

[Serializable]
public class Site {
...
public XmlNamespaceManager xmlNS;
...
}

我尝试将[NonSerialized]挂钩附加到有问题的字段上,但我的SOAP服务似乎没有遵守我的指示。这是服务:

public class DotNetWikiService : WebService
{

    [WebMethod]
    public Article doWork(Site ws, String title)
    {
        Page thePage = new Page(ws, title);
        thePage.Load();

        if (thePage.Exists() == false)
        {
            return new Article(title, "Wiki page contents are empty.");
        }

        return new Article(title, thePage.text);
    }
}

这是我尝试运行.asmx文件时出现的错误:

  

要成为XML可序列化,从IEnumerable继承的类型必须具有   Add(System.Object)在其继承的所有级别上的实现   层次结构。 System.Xml.XmlNamespaceManager不实现Add(System.Object)。

现在,我知道XmlNamespaceManager s不可序列化,所以我试图表明这一点,但是出了点问题,我不知道该怎么做。

请帮忙吗? :d

1 个答案:

答案 0 :(得分:1)

我设法重现了你的问题,在我的小测试中似乎解决了它......

我得到了与你最初相同的错误,但这里重要的不是错误而是堆栈跟踪。这里有一些我得到的东西,我希望你会看到类似的东西:

System.Xml.Serialization.TypeScope.GetEnumeratorElementType(Type type, TypeFlags& flags) +1354352
System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, MemberInfo memberInfo, Boolean directReference) +5553239

所以我们在这里得到一个提示,正在使用的序列化程序是基于System.Xml.Serialization命名空间的XmlSerializer,它在堆栈跟踪中被引用。但是,如果我们看看[NonSerialize] attribute,我们可以在注释中看到它适用于BinaryFormatter和SoapFormatter,但是当我们想要使用XmlSerializer类时。在这种情况下,我们必须使用this属性。

执行此操作会将此公共成员的定义转换为:

[XmlIgnore]
public XmlNamespaceManager xmlNS;

我做了一个小测试课:

[Serializable]
public class Site
{
    public string X { get; set; }

    [XmlIgnore]
    public XmlNamespaceManager xmlNS;
}

并从服务方法返回:

    [WebMethod]
    public Site HelloWorld()
    {
        Site toReturn = new Site();
        toReturn.X = "hello world";

        return toReturn;
    }

跑了起来,它出现在浏览器中。测试了该方法,它在SOAP结构中返回了“hello world”。