6

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

4

11 回答 11

7

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

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

因此,例如,您需要:

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

    [Serializable]
    public MyOtherClass MyOtherClassProperty {get; set;}
}
于 2008-08-15T02:23:16.150 回答
5

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

于 2008-08-15T01:57:01.367 回答
3

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

于 2008-08-15T01:56:31.540 回答
2

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

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

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

于 2008-08-15T02:26:02.463 回答
2

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

但是,如果该对象是基于 Java 的,则客户端只能恢复该对象。此外,需要一个深拷贝来序列化一个对象并准确地恢复它。深拷贝可能很昂贵。

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

于 2008-08-15T03:22:56.140 回答
1

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

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

于 2008-08-15T02:24:07.583 回答
1

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

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

于 2008-08-15T03:31:00.507 回答
1

Daniel Auger:
正如其他人所说,这是可能的。但是,如果服务和客户端都使用在双方都具有完全相同的域行为的对象,那么您可能一开始就不需要服务。

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

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

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

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

对于我最初的回复如此简洁,我深表歉意。我希望这能在一定程度上解决我的观点。Lomax,我们似乎有一半同意;)。

于 2008-08-21T15:31:53.133 回答
1

JSON 是一种在网络上传递对象的非常标准的方式(作为 javascript 的子集)。许多语言都有一个库,可以将 JSON 代码转换为原生对象——例如Python 中的simplejson

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

于 2008-08-21T16:15:26.337 回答
0

正如其他人所说,这是可能的。但是,如果服务和客户端都使用在双方都具有完全相同的域行为的对象,那么您可能一开始就不需要服务。

于 2008-08-18T02:21:44.473 回答
0

正如其他人所说,这是可能的。但是,如果服务和客户端都使用在双方都具有完全相同的域行为的对象,那么您可能一开始就不需要服务。

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

于 2008-08-19T01:43:35.220 回答