2

インターフェイスとインターフェイス/クラスのリストを持つプリミティブ型を含む「複雑な」クラス型を渡そうとしています。

問題のあるメンバーは次のとおりです。

public List<IMyInterface> IntrfList

ランタイムエラー:

http:/localhost/xxxxxx/xxxxxService.svcへのHTTP応答の受信中にエラーが発生しました。これは、HTTPプロトコルを使用していないサービスエンドポイントバインディングが原因である可能性があります。これは、サーバーによってHTTPリクエストコンテキストが中止されたことが原因である可能性もあります(おそらくサービスのシャットダウンが原因です)。詳細については、サーバーログを参照してください。

MS Service Trace Viewer(SvcTraceViewer)からの説明エラー:

タイプ「myType」はシリアル化できません。DataContractAttribute属性でマークを付け、シリアル化するすべてのメンバーをDataMemberAttribute属性でマークすることを検討してください。タイプがコレクションの場合は、CollectionDataContractAttributeでマークすることを検討してください。サポートされている他のタイプについては、Microsoft.NETFrameworkのドキュメントを参照してください。

説明が示唆するように私はしましたが、助けにはなりませんでした。

「共有」クラス:

[System.Runtime.Serialization.DataContract]
    public class ServerState
    {
        private Queue<IJob> _mWaitingQueue;
        public Queue<IJob> mWaitingQueue
        {
            get
            {
                lock (_LockObjWaiting)
                {
                    return _mWaitingQueue;
                }
            }
            private set
            {
                _mWaitingQueue = value;
            }
        }
        private object _LockObjWaiting = new object();

        private List<IJob> _mInPrograssList = new List<IJob>();

        [DataMember]
        public List<IJob> mInPrograssList
        {
            get
            {
                    return _mInPrograssList;
            }
            private set
            {
                _mInPrograssList = value;
            }
        }
}

IJobはインターフェースです。IJobの構造は次のようになります。

IJob (Interface)
  - JobBase (Abstract class)
    - JobA (Driven from JobBase)
    - JobB (Driven from JobBase)
4

1 に答える 1

5

了解しました。

ソリューションをブログに投稿しました:http://livshitz.wordpress.com/2012/11/06/wcf-serialization-datacontract-runtime-error-type-mytype-cannot-be-serialized/

その「共有」クラスのすべての可能な部分と戦い、切り取った後、私は問題のある領域に到達しました。

問題は、Drivenクラスに関連付けられたメンバー(またはリスト..)としてインターフェイスを使用したことでした。

以上です!そのメンバーをシリアル化する方法を理解するのに問題があるシリアライザーなので、解決策は次のとおりです。

WCFを介してシリアル化および共有されようとしているクラスのメンバー(またはインターフェイスのリスト)としてインターフェイスを使用する場合、Sharedクラスは、次の機能を追加して、インターフェイスの可能なタイプを指定する必要があります。

[System.Runtime.Serialization.KnownType(typeof(JobA))]
[System.Runtime.Serialization.KnownType(typeof(JobB))]

そして、これらの各タイプには、次のマークを付ける必要があります。

[System.Runtime.Serialization.DataContract]

注:JobBaseは抽象的であるため、KnownTypeでマークする理由はありません...

それでおしまい。

于 2012-11-06T07:48:06.523 に答える