【问题标题】:Webservice referencing a class with a property of type Icon引用具有 Icon 类型属性的类的 Web 服务
【发布时间】:2011-02-28 01:10:23
【问题描述】:

在我的 web 服务中,我引用了一个 dll,该 dll 包含一个类型为 Icon(以及其他类型为 string 和 DateTime)的属性。 在我的 UnitTest 项目中创建服务引用时,出现以下错误。

错误:

具有数据协定的ISerializable 类型 在命名空间中命名“图标” 'http://schemas.datacontract.org/2004/07/System.Drawing' 无法导入。数据合同 命名空间不能自定义 ISerializable 类型和生成的 命名空间 'KoenHoefman.ExchangeRate.WS.NUnit.QueryService' 与所需的 CLR 不匹配 命名空间'System.Drawing'。检查是否 已映射所需的命名空间 到不同的数据合约命名空间 并考虑明确映射它 使用命名空间集合。

我确实可以访问此 dll 的源代码,因此可以进行一些更改,但这些更改应该被最小化。该类标有Serializable 属性,这可能会给出前面的错误。删除此属性时,我收到另一个错误,指出我必须用 DataContractAttribute 标记类,用 DataMemberAttribute 标记成员。

现在对我来说,这似乎是一个很大的变化,因为这个类很少在 web 服务中使用(只是这一次)。我还没有尝试过,但我想知道是否有其他解决方案可以解决我的问题。

谢谢。

【问题讨论】:

    标签: c# wpf serialization


    【解决方案1】:

    我的建议是你创建另一个类来承载数据 - 这个类可以包装有问题的类并公开所需的属性 - 你应该使用 DataContractAttribute 和 DataMemberAttribute 注释这个类 - 明确标记你的服务合同总是一个好主意.

    就图标而言,您需要决定是否必须通过 Web 服务传输/公开图标信息。如果是,那么您可以公开 byte[] 类型的属性(或 base64 编码字符串)来传输图标数据。

    【讨论】:

    • 好吧,关于暴露的图标:我知道这不太正确,但这样我的应用程序与已经使用此 dll 的其他应用程序拥有相同的图标。我听从了您的建议,使自己成为了一个带有属性 byte[] 而不是 Icon 的包装类。
    • 一个后续问题:为什么明确标记服务合同是个好主意?我以前从未这样做过,也从未遇到任何问题。是否有特殊原因,或者只是“良好做法”? (后者足以让我开始这样做,但也许还有另一个?)
    • @Koan,标记您的合同是一种选择加入模型,即作为合同一部分公开的每个属性都是您有意识的决定。您很可能不会公开某些属性/成员,或者您可以公开具有不同名称的某些属性(在数据合同中) - 这将允许您使用相同的类来实现和接口/合同。当您的服务发生更改并且您仍然可以更改实现但保持合同不变时,可能会发生这种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2010-11-08
    • 1970-01-01
    • 2019-02-23
    • 2012-12-05
    相关资源
    最近更新 更多