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

是否可以从.net webservices返回接口,或者只能返回具体的类?,.net,web-services,interface,.net,Web Services,Interface,我需要从Web服务返回一个复杂类型,并构造了实现接口IMyComplexType的类MyComplexType。现在在我的Web服务中,我有一个方法,它应该返回一个实现IMyComplexType的对象,如下所示: [WebMethod] public IMyComplexType GetMyComplexType() { IMyComplexType myCt = new MyComplexType(); ... return myCt; } 一切都可以编译,但当我运行w

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

[WebMethod]
public IMyComplexType GetMyComplexType()
{
   IMyComplexType myCt = new MyComplexType();
   ...
   return myCt; 
}
一切都可以编译,但当我运行webservice时,它会抛出一个异常,如下所示:

System.NotSupportedException: Cannot serialize interface MyWebService.IMyComplexType.
这是故意的还是我遗漏了什么。我可以通过某种方式装饰我的类或接口来实现这一点吗?我是否必须消除所有接口,只使用具体的或者抽象的基类才能使用.net Web服务实现这一点

编辑:

这是我尝试序列化的接口:

public interface ICustomer
{
     long Id {get; set;}
     string Name {get; set;}
     string EmailAddress {get; set;}
}

已经有一段时间了,但是我相信你只需要让你的接口扩展
ISerializable
,一切都应该很好。

你不需要实现
ISerializable
-你只需要用
Serializable
属性标记接口就可以了。如果您想实现该接口,请尽一切努力——它将为您提供对接口序列化方式的细粒度控制。但是我认为默认的实现应该是可以的。还要检查以确保所有接口成员也可序列化


[编辑]我甚至没有想清楚-无论如何,在尝试序列化iterface时,您都无法实现
ISerializable
ISerializable
适合的地方是需要自定义序列化的自定义类型,这些自定义类型由接口公开。

简短的回答是否,您不能通过Web服务返回接口

很长的答案是,你可以得到你想要的行为,但这有点令人讨厌。解决方案是使用二进制序列化。因此,将类型序列化为字节,让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);
您可能可以通过创建泛型方法来清除反序列化。我应该补充一点,您需要确保能够在客户机上引用复杂类型


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

无法在接口上设置Serializable属性-只能在类、枚举等上设置。我尝试了一下,但没有成功。你还有什么建议吗?我没有任何自定义序列化需要。我只是试图通过接口而不是具体的类型来正确地公开事物。对于.net ws,这是不可能的吗?听起来您接口中的一种类型是不可序列化的-您可以编辑您的帖子并为接口添加代码吗?好的。添加了接口。有没有一种方法可以在不实现ISerializable的情况下实现这一点,因为我只希望它按原样序列化,而不需要定制?这反过来要求我在所有类中实现ISerializable接口——而我希望能够在不必这样做的情况下进行序列化。我只需要公共财产。消除接口,只使用具体类很好,但这是最佳实践吗??