将自定义对象传递给Web服务

13

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


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

8
作为服务请求的参数,提供的对象必须标有[Serializable],根据我之前发布的一些答案,您还需要确保您的自定义对象在构造函数中不包含任何参数。此外,请记住,您类内部的任何逻辑都不会被创建在客户端上创建的代理类中。在客户端上,您只会看到一个默认构造函数和属性。因此,如果您为自定义对象添加方法,请记住客户端将无法看到它们或使用它们。同样的情况也适用于您可能放置在任何属性中的任何逻辑。
举例:
[Serializable]
public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
}

4
Jim,很抱歉,但 [Serializable] 与 Web 服务无关。 - John Saunders
@John:为什么不呢?XmlSerializer难道不也依赖于[Serializable]属性吗? - fretje
添加示例。当需要将自定义对象序列化时,我经常使用[Serializable]属性。 - Jim Scott
3
不,它并不会。参见http://msdn.microsoft.com/en-us/library/182eeyhh(VS.85).aspx。 - John Saunders
[Serializable] 适用于二进制序列化,而不是 XML 序列化。 - DreamSonic

5

看起来这是一个重复的问题,与此问题相同。

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

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


1

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

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

如果您正在创建一个 asmx webservice,那么创建一个可以作为参数传递的对象并不需要做任何特殊处理。

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

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


实际上我既在制作又在消费。你在这里提到的是我一直在做的事情,但是我不断收到来自VS的投诉,说需要在自定义对象中添加一个无参数构造函数(我已经添加了,但没有用)。 - dreadwail
你能否提供相关的代码和具体的“投诉”呢?;-) - fretje

0

看看这个问题,了解如何为您的自定义对象实现XML序列化


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接