2014-11-07 115 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

相关问题