【问题标题】:Passing custom objects to a web service将自定义对象传递给 Web 服务
【发布时间】:2009-06-03 22:46:36
【问题描述】:

我需要将自定义对象传递给远程 Web 服务。我已经读过可能有必要实现 ISerializable,但我已经做到了,我遇到了困难。在 C# 中将自定义对象传递给 Web 服务方法的正确方法是什么?

【问题讨论】:

  • 如果你能具体说明你遇到的困难可能会更好。你到底想做什么,真的吗?也许一些具体的例子会有所帮助。 “传递自定义对象”是什么意思?这可能意味着很多事情。一些细节会有所帮助。

标签: c# .net web-services


【解决方案1】:

您作为服务请求的一部分作为参数提供的对象必须标有 [Serializable],并且根据我之前发布的一些答案,您还需要确保您的自定义对象不包含构造函数中的任何参数。

另外请记住,您在类中的任何逻辑都不会在客户端创建的代理类中创建。您将在客户端看到的只是默认构造函数和属性。因此,如果您向自定义对象添加方法,请记住客户端将看不到它们或无法使用它们。

同样的事情也适用于您可能放入任何属性的任何逻辑。

例子

[Serializable]
public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
}

【讨论】:

  • Jim,抱歉,[Serializable] 与 Web 服务无关。
  • @John:为什么不呢? XmlSerializer 不也依赖 [Serializable] 属性吗?
  • 添加示例。当需要序列化自定义对象时,我一直使用 [Serializable] 属性。
  • @fretje:不,它没有。见msdn.microsoft.com/en-us/library/182eeyhh(VS.85).aspx
  • [Serializable] 适用于二进制序列化,而不是 XML 序列化。
【解决方案2】:

看起来与此 question 重复

无论如何,WS 交互中涉及的所有对象都应该是 XML 可序列化的,而不是 ISerializable(它是二进制序列化)。此外,它们应该在服务合同 (WSDL) 中进行描述,否则客户端将无法使用它们。 This article 应该有助于理解使用 XML Web 服务进行 XML 序列化。

但是,如果您谈论的是真正自定义对象(即任何类型)。您应该考虑以二进制形式传递它们:作为 base64 编码或作为附件。我链接到的问题有一个答案如何做到这一点。

【讨论】:

    【解决方案3】:

    编辑:删除了关于 [Serializable] 的部分

    您是在创建服务还是在使用它?

    要创建一个可以作为 web 方法的参数传递的对象,您不必做任何特别的事情。也就是说,如果您正在创建 asmx 网络服务。

    OTOH,如果您要创建 WCF 服务,则必须使用 [DataContract] 标记类,并使用 [DataMember] 标记所有要序列化的成员。

    如果您正在使用 Web 服务,则应在添加服务引用时生成要传递的对象的代理类。你只需要使用它们。

    【讨论】:

    • 其实我在做和消费。您在这里提到的是我一直在做的事情,但是我不断收到来自 VS 的关于在自定义对象中需要无参数构造函数的抱怨(我已经添加了,但无济于事。)。
    • 您能否提供相关代码和准确的投诉 ;-)
    【解决方案4】:

    查看此question 了解如何为您的自定义对象实现 XML 序列化

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多