C# Web服务引用具有Icon类型属性的类
在我的Web服务中,我引用了一个带有类的dll,该类包含类型为C# Web服务引用具有Icon类型属性的类,c#,wpf,serialization,C#,Wpf,Serialization,在我的Web服务中,我引用了一个带有类的dll,该类包含类型为Icon(其中包括类型为string和DateTime)的属性。 在UnitTest项目中创建服务引用时,出现以下错误 错误: 具有数据协定的ISerializable类型 名称空间中的名称“Icon” 'http://schemas.datacontract.org/2004/07/System.Drawing' 无法导入。数据契约 无法为自定义命名空间 ISerializable类型和生成的 名称空间 'KoenHoefman.E
Icon
(其中包括类型为string
和DateTime
)的属性。
在UnitTest项目中创建服务引用时,出现以下错误
错误:
具有数据协定的ISerializable类型
名称空间中的名称“Icon”
'http://schemas.datacontract.org/2004/07/System.Drawing'
无法导入。数据契约
无法为自定义命名空间
ISerializable类型和生成的
名称空间
'KoenHoefman.ExchangeRate.WS.NUnit.QueryService'
与所需的CLR不匹配
名称空间“System.Drawing”。检查是否
已映射所需的命名空间
到不同的数据协定命名空间
并考虑将其显式地映射
使用名称空间集合
我确实可以访问这个dll的源代码,所以可以进行一些更改,但是这些更改应该最小化。该类用Serializable
属性标记,这可能会给出前面的错误。删除此属性时,我遇到另一个错误,该错误说明我必须使用DataContractAttribute标记类,使用DataMemberAttribute标记成员
现在对我来说,这似乎是一个很大的变化,因为这个类很少在Web服务中使用(就这一次)。我还没有尝试过这个,但我想知道是否有其他解决我的问题的方法
谢谢。我的建议是,您创建另一个类来承载数据-该类可以围绕有问题的类并公开所需的属性-您应该使用DataContractAttribute和DataMemberAttribute对该类进行注释-明确标记您的服务契约始终是一个好主意
至于图标,您需要决定是否必须通过web服务传输/公开图标信息。如果是,则可以公开类型为
byte[]
(或base64编码字符串)的属性传输图标数据。我的建议是创建另一个类来承载数据-该类可以围绕有问题的类并公开所需的属性-您应该使用DataContractAttribute和DataMemberAttribute注释该类-明确标记您的服务契约始终是一个好主意
至于图标,您需要决定是否必须通过web服务传输/公开图标信息。如果是,那么您可以公开类型为
byte[]
(或base64编码字符串)的属性来传输图标数据。好吧,关于公开的图标:我知道这不太正确,但这样我的应用程序与已经使用此dll的其他应用程序保持相同的图标。我听从了你的建议,用一个属性byte[]而不是Icon创建了一个包装类。接下来的问题是:为什么显式标记服务契约是个好主意?我以前从未这样做过,也从未遇到过任何问题。这有什么特别的原因,或者仅仅是“良好实践”?(后一个理由足以让我开始这么做,但可能还有另一个理由?@Koan,标记您的合同是一种选择加入模式,即作为合同一部分的每个财产都是您自己的自觉决定。很可能您不会公开某些属性/成员,或者您可以公开具有不同名称的某些属性(在数据契约中)——这将允许您使用相同的类来实现和接口/契约。当您的服务发生更改时,可能会出现这种情况,您仍然可以更改实现,但保持合同不变。好吧,关于暴露的图标:我知道这不太正确,但这样我的应用程序与已经使用此dll的其他应用程序保持相同的图标。我听从了你的建议,用一个属性byte[]而不是Icon创建了一个包装类。接下来的问题是:为什么显式标记服务契约是个好主意?我以前从未这样做过,也从未遇到过任何问题。这有什么特别的原因,或者仅仅是“良好实践”?(后一个理由足以让我开始这么做,但可能还有另一个理由?@Koan,标记您的合同是一种选择加入模式,即作为合同一部分的每个财产都是您自己的自觉决定。很可能您不会公开某些属性/成员,或者您可以公开具有不同名称的某些属性(在数据契约中)——这将允许您使用相同的类来实现和接口/契约。当您的服务发生更改时,可能会出现这种情况,您仍然可以更改实现,但保持合同不变。