2014-11-07 49 views
1

試圖提交隊列消息在消息主體中的對象,但接收到下一行例外與BrokeredMessage天青服務總線隊列 - 序列化與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'不是預期的。考慮使用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; } 
} 

請幫助查找問題。

回答

2

您在數據合同中缺少[KnownType]屬性,這就是您的消息無法序列化的原因。詳細解釋請參見hehe

只需添加[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>(); 
    } 
} 
+0

非常感謝plentysmart,它的工作。 – 2014-11-07 13:56:58

相關問題