是否可以从.net Web服务返回接口,还是只返回具体类?

时间:2009-01-28 14:18:06

标签: .net web-services interface

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

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

所有内容都可以正常编译,但是当我运行webservice时,会抛出异常,如下所示:

System.NotSupportedException: Cannot serialize interface MyWebService.IMyComplexType.

这是设计还是我遗漏了一些东西。我可以以某种方式装饰我的类或界面以允许这个吗?我是否必须消除所有接口,只能使用具体的,也许是抽象的基类,以便能够使用.net webservices做到这一点?

编辑:

这是我尝试序列化的界面:

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

3 个答案:

答案 0 :(得分:2)

简短回答是否定的,您无法通过WebService返回接口。

很长的答案是,你可以得到你想要的行为,但它有点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);

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您不需要实现ISerializable - 只需标记具有Serializable属性的接口就应该只需要做。如果要实现接口,请务必继续 - 它将为您提供对接口序列化方式的细粒度控制。但我想,默认的实现应该没问题。还要检查以确保所有接口成员都是可序列化的。

[编辑]我甚至没有直接思考 - 当你试图序列化iterface时,你无法实现ISerializableISerializable适合的地方将是需要自定义序列化的自定义类型。