7

アプリケーションのすべてのResponseDTOに基本クラスを使用しています。クラスには次の署名があります。

[Serializable]
public abstract class ResponseBase
{
    public bool Successful { get; set; }
    public List<ResponseMessage> Messages { get; set; }

    //...Other code...
}

メッセージコレクションは、次のいずれかのタイプにすることができます。

[Serializable]
[XmlInclude(typeof(DebugMessage))]
[XmlInclude(typeof(InfoMessage))]
[XmlInclude(typeof(ValidationMessage))]
[XmlInclude(typeof(WarnMessage))]
[XmlInclude(typeof(RecoverableFaultMessage))]
[XmlInclude(typeof(FatalFaultMessage))]
public abstract class ResponseMessage
{
    //..Other code...
}

具体的なバージョン:

[Serializable]
public class DebugMessage : ResponseMessage
{
    public override MessageType MessageType { get { return MessageType.Debug; } }
}
[Serializable]
public class InfoMessage : ResponseMessage
{
    public override MessageType MessageType { get { return MessageType.Info; } }
}
[Serializable]
public class ValidationMessage : ResponseMessage
{
    public override MessageType MessageType { get { return MessageType.Validation; } }
}
[Serializable]
public class WarnMessage : ResponseMessage
{
    public override MessageType MessageType { get { return MessageType.Warn; } }
}
[Serializable]
public class RecoverableFaultMessage : ResponseMessage
{
    public override MessageType MessageType { get { return MessageType.RecoverableFault; } }
}
[Serializable]
public class FatalFaultMessage : ResponseMessage
{
    public override MessageType MessageType { get { return MessageType.FatalFault; } }
}

すべてのDTOResponseオブジェクトはResponseBaseから継承しますが、WCFコントラクトに次のServiceKnownTypesがある場合でも

[ServiceKnownType(typeof(ResponseBase))]
[ServiceKnownType(typeof(ResponseMessage))]
[ServiceKnownType(typeof(List<ResponseMessage>))]
[ServiceKnownType(typeof(DebugMessage))]
[ServiceKnownType(typeof(InfoMessage))]
[ServiceKnownType(typeof(ValidationMessage))]
[ServiceKnownType(typeof(WarnMessage))]
[ServiceKnownType(typeof(RecoverableFaultMessage))]
[ServiceKnownType(typeof(FatalFaultMessage))]
[ServiceKnownType(typeof(List<DebugMessage>))]
[ServiceKnownType(typeof(List<InfoMessage>))]
[ServiceKnownType(typeof(List<ValidationMessage>))]
[ServiceKnownType(typeof(List<WarnMessage>))]
[ServiceKnownType(typeof(List<RecoverableFaultMessage>))]
[ServiceKnownType(typeof(List<FatalFaultMessage>))]

メッセージをResponseBaseメッセージコレクションにロードすると、次の例外がスローされます。

1行目の906の位置にエラーがあります。要素'http://schemas.datacontract.org/2004/07/CX.Framework.Common.BaseTypes:ResponseMessage'には、名前'http://schemasにマップされるタイプのデータが含まれています。 datacontract.org/2004/07/CX.Framework.Common.BaseTypes:WarnMessage'。デシリアライザーは、この名前にマップされるタイプを認識していません。DataContractResolverの使用を検討するか、「WarnMessage」に対応するタイプを既知のタイプのリストに追加します。たとえば、KnownTypeAttribute属性を使用するか、DataContractSerializerに渡される既知のタイプのリストに追加します。

派生型に対してServiceKnownTypeからXMLIncludeまですべてを実行しました。私はこれを解決する方法について少し途方に暮れています、そして誰でも提供できるどんな援助にも感謝します。

4

1 に答える 1

5

いくつかのこと:

1)[XmlInclude]には影響しません。これはDataContractSerializer、によってのみ使用されますXmlSerializer

2)コメンター「flem」が示唆したように、私はサービスではなく[KnownType]直接使用します。ResponseMessage[ServiceKnownType]

3)偶数が型DataContractSerializerを探すかどうかは覚えていません。少なくとも今のところテストの目的で、上記の#2が役に立たない場合は、代わりにタイプを作成してみてください(そしてデータメンバーに属性を付けてください)。[KnownType][Serializable][DataContract][DataMember]

于 2012-12-20T17:24:11.290 に答える