我需要从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;}
}
答案 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时,你无法实现ISerializable
。 ISerializable
适合的地方将是需要自定义序列化的自定义类型。