是否可以从WebService返回对象?

时间:2008-08-15 01:51:49

标签: web-services

有没有办法返回经典对象,而不是返回一个公共字符串? 如果不是:最佳做法是什么?您是否将对象转置为xml并重建另一侧的对象?还有什么其他可能性?

11 个答案:

答案 0 :(得分:8)

如前所述,您可以通过序列化在.net中执行此操作。默认情况下,所有本机类型都是可序列化的,因此这会自动发生。

但是,如果您有复杂类型,则需要使用[Serializable]属性标记对象。复杂类型作为属性也是如此。

所以例如你需要:

[Serializable]
public class MyClass
{
    public string MyString {get; set;}

    [Serializable]
    public MyOtherClass MyOtherClassProperty {get; set;}
}

答案 1 :(得分:5)

如果对象可以序列化为XML并且可以在WSDL中描述,则可以从Web服务返回对象。

答案 2 :(得分:3)

是的:在.NET中,他们称之为序列化,其中对象被序列化为XML,然后由使用服务重新构建回原始对象类型或具有相同数据结构的代理。

答案 3 :(得分:2)

在可能的情况下,我将对象转换为XML - 这意味着Web服务更具可移植性 - 然后我可以用任何语言访问服务,我只需要用该语言创建解析器/对象转置器。

因为我们有描述服务的WSDL文件,所以在某些系统中这几乎是自动化的。

(例如,我们有一个用纯python编写的服务器,它替换用C编写的服务器,用C ++ / gSOAP编写的客户端,以及用Cocoa / Objective-C编写的客户端。我们使用soapUI作为测试框架,用Java编写。)

答案 4 :(得分:2)

可以使用XML从Web服务返回对象。但Web服务应该是平台和操作系统无关的。序列化对象只允许您从字节流(如文件)中存储和检索对象。例如,您可以序列化Java对象,将该二进制流(可能通过Base 64编码转换为CDATA字段)并将其传输到服务的客户端。

但是客户端只能在基于Java的情况下恢复该对象。此外,需要深度复制来序列化对象并使其完全恢复。深拷贝可能很昂贵。

您最好的方法是创建一个表示文档的XML架构,并使用对象细节创建该架构的实例。

答案 5 :(得分:1)

.NET自动对可序列化的对象执行此操作。我很确定Java的工作方式是一样的。

这篇文章讨论了.NET中的对象序列化: http://www.codeguru.com/Csharp/Csharp/cs_syntax/serialization/article.php/c7201

答案 6 :(得分:1)

@Brian:我不知道Java中的工作原理,但是.net对象被序列化为XML,而不是base64字符串。 webservice发布一个wsdl文件,其中包含Web服务所需的方法和对象定义。

我希望没有人创建简单地创建base64字符串的web服务

答案 7 :(得分:1)

  
    

Daniel Auger:
    正如其他人所说,这是可能的。     但是,如果服务和     客户端使用具有的对象     完全相同的域行为     双方,你可能不需要了     服务首先。

  
     

<强>洛马克斯:   我不得不反对这一点,因为它是一个   评论有点狭隘。用一个   可以序列化域的webservice   对象到XML意味着它成功   对于与之合作的客户来说很容易   相同的域对象,但它也意味着   那些客户被限制   使用该特定的Web服务   你暴露了它,它也适用于   通过允许其他客户端来反转   不了解您的域名   对象,但仍与您的互动   通过XML服务。

@ Lomax:您已经描述了两种情况。 场景1:客户端正在将xml消息重新水化回完全相同的域对象。我认为这是“归还一个对象”。根据我的经验,这是一个糟糕的选择,我将在下面解释。 场景2:客户端将xml消息重新水化为完全相同的域对象以外的其他内容:我100%落后于此,但我不认为这是返回域对象。这真的是发送消息或DTO。

现在让我解释一下为什么真正/纯/非DTO对象序列化在Web服务通常一个坏主意。断言:为了首先执行此操作,您必须是客户端和服务的所有者,或者为客户端提供要使用的库,以便他们可以将对象重新水化为它的真实类型。问题:此域对象现在作为一种类型存在于并属于两个半相关域。随着时间的推移,可能需要在一个域中添加行为,这在其他域中没有意义,这会导致污染和潜在的痛苦问题。

我通常默认使用方案2.我只有在有压倒性的理由时才使用方案1.

我为我的初步答复如此简洁而道歉。我希望这可以在某种程度上清除我的意见。 Lomax,我们似乎半同意;)。

答案 8 :(得分:1)

JSON是一种非常标准的方式来传递Web上的对象(作为javascript的一个子集)。许多语言都有一个库,可以将JSON代码转换为本机对象 - 例如参见Python中的simplejson

有关JSON使用的更多库,请参阅JSON webpage

答案 9 :(得分:0)

正如其他人所说,这是可能的。但是,如果服务和客户端都使用两端具有完全相同域行为的对象,则可能首先不需要服务。

答案 10 :(得分:0)

  

正如其他人所说,这是可能的。   但是,如果服务和   客户端使用具有的对象   完全相同的域行为   双方,你可能不需要了   服务首先。

我不同意这一点,因为这是一个有点狭隘的评论。使用可以将域对象序列化为XML的Web服务意味着它可以使使用相同域对象的客户端变得容易,但这也意味着这些客户端仅限于使用您公开的特定Web服务,并且它也适用于反过来允许其他客户端不了解您的域对象,但仍然通过XML与您的服务进行交互。