1

メッセージ本文にオブジェクトを含むキュー メッセージを送信しようとしましたが、次の行で BrokeredMessage を使用して例外を受け取りました

QueueClient queueClient = QueueClient.CreateFromConnectionString(_connectionString, _queuePathName);
var data = new ABSurvey
                {
                    name = "somename",
                    version = 1,
                    language = "eng",
                    SelfSurvey = new Survey()
                    {
                        SurveyItems = new List<ISurveyItem>() { new SurveyItem(){IsSelected = true, ItemId = 1}},
                        SurveyPerception = Constants.Perception.Self
                    },
                    SelfConcept = new Survey()
                    {
                        SurveyItems = new List<ISurveyItem>() { new SurveyItem(){IsSelected = true, ItemId = 1}},
                        SurveyPerception = Constants.Perception.SelfConcept
                    }
                };
                BrokeredMessage message = new BrokeredMessage(data);
                queueClient.Send(message); 

例外メッセージ -データ コントラクト名 'Survey: http://schemas.datacontract.org/2004/07/namespace ' を持つタイプ '.Survey'は想定されていません。DataContractResolver の使用を検討するか、既知の型のリストに静的に認識されていない型を追加します。たとえば、KnownTypeAttribute 属性を使用するか、DataContractSerializer に渡される既知の型のリストにそれらを追加します。

これらは私が持っているモデルです -

    [DataContract]
public class ABSurvey
{
    [DataMember] public string name;
    [DataMember] public int version;
    [DataMember] public string language;
    [DataMember] public ISurvey SelfSurvey;
    [DataMember] public ISurvey SelfConcept;
}

[DataContract]
public class SurveyItem : ISurveyItem
{
    [DataMember]
    public int ItemId { get; set; }
    [DataMember]
    public bool IsSelected { get; set; }
    public SurveyItem()
    {
        ItemId = -1;
        IsSelected = false;
    }
}

[DataContract]
public class Survey : ISurvey
{
     [DataMember]
    public IList<ISurveyItem> SurveyItems { get; set; }
     [DataMember]
    public Constants.Perception SurveyPerception { get; set; }
    public Survey()
    {
        SurveyItems = new List<ISurveyItem>();
    }
}

public interface ISurvey
{
    [DataMember]
    IList<ISurveyItem> SurveyItems { get; set; }
    [DataMember]
    Constants.Perception SurveyPerception { get; set; }
}
public interface ISurveyItem
{
    [DataMember]
    int ItemId { get; set; }
    [DataMember]
    bool IsSelected { get; set; }
}

問題の特定にご協力ください。

4

1 に答える 1

3

データ コントラクトの属性が欠落[KnownType]しているため、メッセージをシリアル化できません。詳細な説明があります

[KnownType] 属性を追加するだけで、使用できる具体的な実装をシリアライザーに伝えることができます。

[KnownType(typeof(Survey))]
[DataContract]  
public class ABSurvey
{
    [DataMember]
    public string name;
    [DataMember]
    public int version;
    [DataMember]
    public string language;
    [DataMember]
    public ISurvey SelfSurvey;
    [DataMember]
    public ISurvey SelfConcept;
}

[KnownType(typeof(SurveyItem))]
[DataContract]
public class Survey : ISurvey
{
    [DataMember]
    public IList<ISurveyItem> SurveyItems { get; set; }

    public Survey()
    {
        SurveyItems = new List<ISurveyItem>();
    }
}
于 2014-11-07T11:01:24.503 に答える