gpt4 book ai didi

.net - 是否可以从.net webservices返回接口(interface),或者只能返回具体类?

转载 作者:行者123 更新时间:2023-12-04 12:50:11 27 4
gpt4 key购买 nike

我需要从 web 服务返回一个复杂类型,并构建了实现 IMyComplexType 接口(interface)的 MyComplexType 类。现在在我的网络服务中,我有一个方法应该返回一个实现 IMyComplexType 的对象,如下所示:

[WebMethod]
public IMyComplexType GetMyComplexType()
{
IMyComplexType myCt = new MyComplexType();
...
return myCt;
}

一切都可以编译,但是当我运行 web 服务时,它会引发如下异常:
System.NotSupportedException: Cannot serialize interface MyWebService.IMyComplexType.

这是设计使然还是我遗漏了什么。我可以以某种方式装饰我的类(class)或界面以允许这样做吗?我是否必须消除所有接口(interface),只使用具体的和可能是抽象的基类才能使用 .net webservices 做到这一点?

编辑:

这是我要序列化的接口(interface):
public interface ICustomer
{
long Id {get; set;}
string Name {get; set;}
string EmailAddress {get; set;}
}

最佳答案

简短的回答是否定的,您不能通过 WebService 返回接口(interface)。

长答案是你可以得到你想要的行为,但这有点hacky。解决方案是使用二进制序列化。所以你将你的类型序列化为字节,让 web 方法返回一系列字节,然后在另一方面你将字节反序列化回你的复杂类型。

例如

[WebMethod]
public byte[] GetMyComplexType()
{

IMyComplexType myCt = new MyComplexType();
...

MemoryStream stream = new MemoryStream();
IFormatter fmt = new BinaryFormatter();
fmt.Serialize(stream, myCt);
stream.Flush();
byte[] bytes = stream.ToArray();
stream.Close();

return bytes;
}

您需要将所有内容都转换回另一端。
byte[] bytes = service.GetMyComplexType();
MemoryStream stream = new MemoryStream(bytes);
BinaryFormatter fmt = new BinaryFomatter();
MyComplexType myCt = fmt.DeSerialize(stream);

您可能可以通过创建通用方法来清理反序列化。我应该补充一点,您需要确保可以在客户端上引用复杂类型。

或者,如果它们是您的接口(interface),那么您可以将它们转换为抽象类。但是,如果您希望该类实现多个接口(interface)(或者您已经从另一个类继承),这将不起作用,因为您只能继承一个类。如果您需要客户端上的某些多态行为,则需要使用 XmlInclude 属性。

关于.net - 是否可以从.net webservices返回接口(interface),或者只能返回具体类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/487773/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com