0

我使用 Azure 主题和订阅作为消息总线。但是当我执行message.GetBody()时,我得到了一个 SerializationException。我想要实现的是让一个订阅者读取所有 BaseEvent 类型的事件,并且每个事件都有自己的订阅者。但是当我试图序列化主体(BaseEvent)时它失败了。那么如何序列化正文以获取 UserEvent 和 TeamEvent 呢?我的代码如下所示:

public abstract class BaseEvent
{
    public long ActivityId { get; set; }
}

public class UserEvent
{
    public string Name { get; set; }
}

public class TeamEvent
{
    public string Name { get; set; }
}

我将它们添加到消息总线中,如下所示:

public async Task HandleAsync(BaseEvent request)
{
     var message = new BrokeredMessage(request)
     {
         CorrelationId = request.Id.ToString()
     };

     await topicClient.SendAsync(message);
     await topicClient.CloseAsync();
}

当我要从公共汽车上阅读时,我会这样做:

BrokeredMessage message;
while ((message = client.Receive(new TimeSpan(0, 0, 5))) != null)
{
    models.Add(message.GetBody<BaseEvent>()); // THIS FAILS SerlizationException
    message.Complete();
}
4

1 回答 1

0

作为BrokeredMessage 构造函数声明:

public BrokeredMessage(
    Object serializableObject
)

它使用带有二进制 XmlDictionaryWriter 的 DataContractSerializer 从给定对象初始化 BrokeredMessage 类的新实例。所以 BaseEvent 类必须支持 DataContractSerializer。至于怎么做,请参考序列化和反序列化

于 2014-08-20T13:36:22.423 回答