【问题标题】:C# web service ... return nested custom objectsC# web 服务...返回嵌套的自定义对象
【发布时间】:2010-12-15 11:27:23
【问题描述】:

我已经开始在 VS2005 中开发一个新的 Web 服务。只有一种方法:

[WebMethod]  
[XmlInclude(typeof(Person))]  
public PersonAction GetAction()  
{  
   PersonAction action = new PersonAction();  
   return action;  
}  

其中PersonAction 类包含一个引用Person 类的字段

[Serializable]  
public class PersonAction    
{  
    private string actionName = "XAction";  
    private Person person1;  
    private Person person2;  

    public PersonAction() 
    {
        this.person = new Person();
        this.person.Name = "P1";
    }

    public string Name
    {
        get
        {
            return this.actionName;
        }
    }
    [XmlElement(Type = typeof(Person))]
    public Person Person1
    {
        get
        {
            return this.person1;
        }
    }
}  

我已经构建它,运行它...但是 wsdl 它总是包含一个空标签 PersonAction ...没有可用的嵌入式类型定义,所以我在客户端总是得到 null。

XmlElementXmlInclude[Serializable]显然没有效果...

我确定我错过了什么。
肯定有人在过去遇到过这个问题并且知道解决方案。我真的很感激任何对 VS2005 (.NET 2.0) 有帮助的代码。

谢谢

【问题讨论】:

  • 我可以看到,将所有私有字段都更改为公共后,它就可以工作了...但是为什么公共属性如果引用私有字段则不序列化?

标签: c# object web-services return


【解决方案1】:

您的 Person Action 类中可能缺少 XmlRoot 属性。 XmlInclude 也可能是不必要的。

编辑添加:

  • 我使用(在我的 ASMX/.NET 2.0 Web 服务中)XmlRoot,但不使用 XmlInclude。
  • 我注意到一件奇怪的事情:您的属性是唯一的。我相信惯例是在可序列化的类中设置数据保存属性。
  • 您可以尝试的另一件事是获取服务的 WSDL,通过 WSDL 实用程序运行它,查看 wsdl.exe 如何生成可序列化的类并查看差异 - 当然,这是一个 .NET 2.0/ASMX 特定的建议.

【讨论】:

  • 非常感谢您的快速响应...我可以看到,在我将所有私有字段都更改为公共后,它可以工作...但是为什么公共属性如果引用则没有序列化私有字段?
  • 是的,“二传手”是问题所在,正如“jvenema”所暗示的那样。非常感谢
【解决方案2】:

您使变量公开的更改似乎可以解决它,但实际上并没有。该服务现在正在序列化公共变量,而不是属性。

尝试将变量改回私有,并添加一个“setter”函数。我相信这是序列化所必需的。

【讨论】:

  • 非常感谢您的宝贵建议。有些东西告诉我你对“二传手”的看法是正确的:)。让我们看看(5 分钟)。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 2011-05-12
  • 2017-03-24
  • 1970-01-01
相关资源
最近更新 更多