Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Web服务引用具有Icon类型属性的类_C#_Wpf_Serialization - Fatal编程技术网

C# Web服务引用具有Icon类型属性的类

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

在我的Web服务中,我引用了一个带有类的dll,该类包含类型为
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,标记您的合同是一种选择加入模式,即作为合同一部分的每个财产都是您自己的自觉决定。很可能您不会公开某些属性/成员,或者您可以公开具有不同名称的某些属性(在数据契约中)——这将允许您使用相同的类来实现和接口/契约。当您的服务发生更改时,可能会出现这种情况,您仍然可以更改实现,但保持合同不变。