使用QueueTriggerAttribute在Queue中反序列化具有相同属性的POCO类型?

时间:2018-03-21 17:22:34

标签: azure azure-webjobs azure-queues

如何将其反序列化为原始类型? WebJobs SDK允许指定POCO对象的类型,并在其附近添加QueueTriggerAttribute以使其起作用(the doc)。现在它反序列化不是原始类型,而是其他一些(从运行到运行它变化)。这是代码:

public class PocoCommandA { public string Prop { get; set; } }

public class PocoCommandB { public string Prop { get; set; } }

public static void Func1([QueueTrigger("myqueue")] PocoCommandA aCommand)
{... }

public static void Func2([QueueTrigger("myqueue")] PocoCommandB bCommand)
{ ... }

时调用Fun2(或其他一些)
var a = new PocoCommandA();
var cloudQueueMessage = new CloudQueueMessage(JsonConvert.SerializeObject(a));

await queue.AddMessageAsync(cloudQueueMessage);

2 个答案:

答案 0 :(得分:1)

如果PocoCommandA和PocoCommandB 2类具有相同的属性,则它不能 知道哪条消息属于特定对象。因为它可能是2个对象中的任何一个。通常,我们不建议2个类具有相同的属性。

如果PocoCommandA和PocoCommandB 2类具有不同的属性,那么如果我们将Poco消息发送到队列,则将触发相应的功能。我们不需要反序列化它。我们可以直接使用aCommand或bCommand。

答案 1 :(得分:0)

通过手动处理序列化/反序列化来修复。这需要使用switch来完成消息的处理(当然可以是反射)。

反序列化:

var message = (IMessage) JsonConvert.DeserializeObject(msg, 
                new JsonSerializerSettings() {
                        TypeNameHandling = TypeNameHandling.Objects,
                        DateParseHandling = DateParseHandling.DateTimeOffset
} );

序列化:

new CloudQueueMessage(JsonConvert.SerializeObject(msg, /* the same */));

WebJobs SDK处理的地方是here。但它不可配置。 Issue在那里创建了。