私のwebserviceでタイプIcon
(他のタイプの中でも特に)のプロパティを保持するクラスを持つdllを参照しています(とDateTime
)。 UnitTestプロジェクトでサービス参照を作成すると、次のエラーが発生します。Webサービスで、タイプアイコンのプロパティを持つクラスを参照しています
エラー:
ISerializable type with data contract name 'Icon' in namespace 'http://schemas.datacontract.org/2004/07/System.Drawing' cannot be imported. The data contract namespace cannot be customized for ISerializable types and the generated namespace 'KoenHoefman.ExchangeRate.WS.NUnit.QueryService' does not match the required CLR namespace 'System.Drawing'. Check if the required namespace has been mapped to a different data contract namespace and consider mapping it explicitly using the namespaces collection.
私はそれはいくつかの変更を行うことが可能ですので、このDLLのソースコードへのアクセス権を持っていますが、これらの変化は非常に最小限にすべきです。クラスにはSerializable
というアトリビュートが付けられています。これはおそらく以前のエラーを示しています。この属性を削除すると、DataContractAttributeでクラスをマークし、DataMemberAttributeでメンバーをマークしなければならないという別のエラーが発生しました。
これは、このクラスがほとんど(今度は)Webサービスではほとんど使われないので、私にとっては大きな変化があります。私はまだこれを試していないが、私の問題の別の解決方法があるのだろうかと思っていた。
ありがとうございました。
アイコンについて:私はそれが正しくないと知っていますが、この方法では、私のアプリはこのDLLを既に使っている他のアプリと同じアイコンを保持しています。私はあなたの助言に従って、Iconの代わりにプロパティバイト[]を持つラッパークラスにしました。 – Koen
フォローアップの質問:なぜサービス契約に明示的に印を付けるのが良い考えですか?私はこれまで決してしなかったし、決して問題に遭わなかった。それには特別な理由があるのでしょうか、あるいは単に「良い実践」ですか? (後者は私がそれをやり遂げるのに十分な理由ですが、別のものがあるかもしれません) – Koen
@Koan、あなたの契約書はオプトインモデルです。つまり、契約の一部として公開されている各プロパティは、あなたの意思決定です。特定のプロパティ/メンバーを公開していない可能性があります。または、異なる名前(データコントラクト)の特定のプロパティを公開することができます。これにより、実装およびインターフェイス/契約に同じクラスを使用できます。このようなシナリオは、サービスが変更されても実装を変更できますが、契約を同じに保つことができます。 – VinayC