在C#xml web服务中使用接口
如何在XMLWeb服务中使用接口(从哪个类实现)在C#xml web服务中使用接口,c#,web-services,C#,Web Services,如何在XMLWeb服务中使用接口(从哪个类实现) 当我这样做时,我得到一个YSOD,声称接口不可序列化。如果我将Serializable属性添加到接口的类中,则会出现另一个妨碍进度的错误(记不清是哪个错误)。我猜另一个消息是无法序列化接口,因为它不包含默认(无参数)构造函数 如果底层类是框架类,那么您可能会被套住。其中有些没有标记为可序列化,有些没有无参数构造函数。我猜另一个消息是,您无法序列化接口,因为它不包含默认(无参数)构造函数 如果底层类是框架类,那么您可能会被套住。有些接口没有标记为可
当我这样做时,我得到一个YSOD,声称接口不可序列化。如果我将Serializable属性添加到接口的类中,则会出现另一个妨碍进度的错误(记不清是哪个错误)。我猜另一个消息是无法序列化接口,因为它不包含默认(无参数)构造函数
如果底层类是框架类,那么您可能会被套住。其中有些没有标记为可序列化,有些没有无参数构造函数。我猜另一个消息是,您无法序列化接口,因为它不包含默认(无参数)构造函数
如果底层类是框架类,那么您可能会被套住。有些接口没有标记为可序列化,有些接口没有无参数构造函数。在大多数情况下,如果不做一些工作,接口是不可序列化的。通常,当被序列化的类包含使用接口作为变量的对象或其某些变体时,会遇到此错误。例如,类似这样的属性会引发错误:
[Serializable]
public class TestClass
{
private ICustomInterface _iCustomInterfaceObject;
public ICustomInterface CustomInterfaceProperty
{
get { return _iCustomInterfaceObject; }
set { _iCustomInterfaceObject = value; }
}
}
为了这个参数(而不是让我输入额外的验证代码),让我们假设您总是将CustomInterfaceProperty分配给从ICustomInterface继承的对象(在使用这样的接口类型时是必需的)。即使100%确定总是填充它,它也不允许序列化TestClass
为了解决这个问题,您需要确保您正在使用的接口(抛出错误的接口)也继承了ISerializable。这样,您就可以保证从ICustomInterface继承的所有对象也都实现了序列化方法
不幸的是,使用xml序列化时并非如此。如果您使用System.Xml.Serialization中的序列化程序,那么此方法将无法工作,因为正如Robert Harvey指出的那样,接口不包含无参数构造函数(这是使用Xml序列化程序时所必需的)。我现在的建议是,如果您设置了这种序列化方法,请将属性[XmlIgnore]附加到所讨论的部分,然后从那里继续。对于大多数情况,如果不做一些工作,接口是不可序列化的。通常,当被序列化的类包含使用接口作为变量的对象或其某些变体时,会遇到此错误。例如,类似这样的属性会引发错误:
[Serializable]
public class TestClass
{
private ICustomInterface _iCustomInterfaceObject;
public ICustomInterface CustomInterfaceProperty
{
get { return _iCustomInterfaceObject; }
set { _iCustomInterfaceObject = value; }
}
}
为了这个参数(而不是让我输入额外的验证代码),让我们假设您总是将CustomInterfaceProperty分配给从ICustomInterface继承的对象(在使用这样的接口类型时是必需的)。即使100%确定总是填充它,它也不允许序列化TestClass
为了解决这个问题,您需要确保您正在使用的接口(抛出错误的接口)也继承了ISerializable。这样,您就可以保证从ICustomInterface继承的所有对象也都实现了序列化方法
不幸的是,使用xml序列化时并非如此。如果您使用System.Xml.Serialization中的序列化程序,那么此方法将无法工作,因为正如Robert Harvey指出的那样,接口不包含无参数构造函数(这是使用Xml序列化程序时所必需的)。现在,我的建议是,如果您设置了这种序列化方法,请将属性[XmlIgnore]附加到所讨论的部分,然后从那里继续。我的建议是将经过连接的对象视为基本数据传输对象,仅此而已。您可能只想使用域对象并对其进行序列化,但正如您已经看到的,普通内存中的对象可能比不需要大量工作就可以进行序列化的对象复杂得多,有时甚至根本不会 您还可以限制域类的功能,以保持它们的可序列化性
最后,要避免的一个更微妙的错误,也是使用单独DTO的一个原因,是您将域对象紧密地耦合到公开发布的接口,即web服务本身。对web服务进行版本控制可能会很麻烦,如果您的服务接口没有与域类紧密耦合,那么就更容易了。我的建议是将通过网络传输的对象视为基本数据传输对象,仅此而已。您可能只想使用域对象并对其进行序列化,但正如您已经看到的,普通内存中的对象可能比不需要大量工作就可以进行序列化的对象复杂得多,有时甚至根本不会 您还可以限制域类的功能,以保持它们的可序列化性
最后,要避免的一个更微妙的错误,也是使用单独DTO的一个原因,是您将域对象紧密地耦合到公开发布的接口,即web服务本身。对web服务进行版本控制可能会很麻烦,如果服务接口没有与域类紧密耦合,则更容易实现。此外,您可能会混淆运行时序列化和XML序列化。XML序列化是旧的ASMX web服务所使用的。它不太注意[Serializable]属性,但主要只是序列化具有默认构造函数的公共类的公共读/写属性。此外,您可能会混淆运行时序列化和XML序列化。XML序列化是旧的ASMX web服务所使用的。它不太注意[Serializable]属性,但主要只是序列化具有默认构造函数的公共类的公共读/写属性。其他异常可能会有所帮助