是否可以从WebService返回对象?
除了返回公共字符串,还可以返回经典对象吗?
如果没有:最佳实践是什么?我们是否将对象转换为xml并在另一侧重建对象?还有其他可能性吗?
解决方案
回答
是的:在.NET中,他们将其称为序列化,即将对象序列化为XML,然后由使用方服务将其重构回其原始对象类型或者具有相同数据结构的代理。
回答
如果对象可以序列化为XML并且可以在WSDL中描述,则可以,可以从Web服务返回对象。
回答
如前所述,我们可以通过序列化在.net中进行此操作。默认情况下,所有本机类型都是可序列化的,因此对我们而言这是自动发生的。
但是,如果我们有复杂的类型,则需要使用[Serializable]属性标记该对象。对于属性,复杂类型也是如此。
因此,例如,我们需要:
[Serializable] public class MyClass { public string MyString {get; set;} [Serializable] public MyOtherClass MyOtherClassProperty {get; set;} }
回答
.NET使用可序列化的对象自动执行此操作。我很确定Java的工作方式相同。
这是一篇讨论.NET中对象序列化的文章:
http://www.codeguru.com/Csharp/Csharp/cs_syntax/serialization/article.php/c7201
回答
在可能的情况下,我将对象转换为XML,这意味着Web Service具有更高的可移植性,然后我可以使用任何一种语言访问该服务,我只需要用该语言创建解析器/对象转置器即可。
因为我们有描述服务的WSDL文件,所以在某些系统中这几乎是自动化的。
(例如,我们有一个用纯python编写的服务器,它将替换用C编写的服务器,一个用C ++ / gSOAP编写的客户端,以及一个用Cocoa / Objective-C编写的客户端。我们使用soapUI作为测试框架,用Java编写)。
回答
可以使用XML从Web服务返回对象。但是,Web服务应该与平台和操作系统无关。序列化对象仅允许我们从字节流(例如文件)中存储和检索对象。例如,我们可以序列化Java对象,转换该二进制流(也许通过Base 64编码转换为CDATA字段),然后将其传输到服务的客户端。
但是,如果该对象是基于Java的,则客户端只能还原该对象。此外,需要深拷贝来序列化对象并使其准确还原。深拷贝可能很昂贵。
最好的方法是创建一个表示文档的XML模式,并使用对象的详细信息创建该模式的实例。
回答
@Brian:我不知道Java中的工作方式,但是在.net中,对象被序列化为XML,而不是base64字符串。 Web服务将发布一个wsdl文件,其中包含Web服务所需的方法和对象定义。
我希望没有人会创建仅创建base64字符串的Web服务
回答
正如其他人所说,这是可能的。但是,如果服务和客户端使用的对象在两个方面都具有完全相同的域行为,则可能一开始就不需要服务。
回答
As others have said, it is possible. However, if both the service and client use an object that has the exact same domain behavior on both sides, you probably didn't need a service in the first place.
我不得不不同意这一点,因为这是一个狭窄的评论。使用可以将域对象序列化为XML的Web服务意味着它使使用相同域对象的客户端变得容易,但是这也意味着这些客户端只能使用我们公开的特定Web服务,并且可以在通过允许其他客户端不了解域对象而是通过XML与服务进行交互来实现反向操作。
回答
Daniel Auger: As others have said, it is possible. However, if both the service and client use an object that has the exact same domain behavior on both sides, you probably didn't need a service in the first place.
lomax:
我必须不同意这一点,因为这是
有点狭窄的评论。用一个
可以序列化域的Web服务
XML对象意味着它
对于与
相同的领域对象,但这也意味着
这些客户仅限于
使用该特定的Web服务
你已经暴露了,它也可以在
通过允许其他客户进行反向操作
不了解域名
对象,但仍与对象互动
通过XML服务。
@ Lomax:我们已经描述了两种情况。方案1:客户端将xml消息重新补水到完全相同的域对象中。我认为这是"返回对象"。以我的经验,这是一个错误的选择,下面将对此进行解释。方案2:客户端将xml消息重新补水为完全不相同的域对象:我落后于100%,但是我不认为这是返回域对象。它实际上是在发送消息或者DTO。
现在让我解释一下为什么在Web服务上进行true / pure / not DTO对象序列化通常是一个坏主意。断言:首先要做到这一点,我们或者必须既是客户端又是服务的所有者,或者为客户端提供要使用的库,以便他们可以将对象重新水化为真实类型。问题:此域对象作为类型现在存在于两个半相关域中,并且属于两个半相关域。随着时间的流逝,可能需要在一个域中添加行为,而在另一个域中没有意义,这会导致污染和潜在的痛苦问题。
我通常默认使用方案2. 仅在有绝对原因的情况下才使用方案1.
对于最初的回答如此简短,我深表歉意。我希望这会尽我所能将事情清除。 Lomax,看来我们一半都同意;)。
回答
JSON是在网络上传递对象(作为javascript的子集)的一种非常标准的方法。许多语言都具有一个库,该库会将JSON代码转换为本地对象,例如参见Python中的simplejson。
有关更多可用于JSON的库,请参见JSON网页