Search code examples
c#azureazure-storage-queues

Passing object messages in Azure Queue Storage


I'm trying to find a way to pass objects to the Azure Queue. I couldn't find a way to do this.

As I've seen I can pass string or byte array, which is not very comfortable for passing objects.

Is there anyway to pass custom objects to the Queue?

Thanks!


Solution

  • You can use the following classes as example:

     [Serializable]
        public abstract class BaseMessage
        {
            public byte[] ToBinary()
            {
                BinaryFormatter bf = new BinaryFormatter();
                byte[] output = null;
                using (MemoryStream ms = new MemoryStream())
                {
                    ms.Position = 0;
                    bf.Serialize(ms, this);
                    output = ms.GetBuffer();
                }
                return output;
            }
    
            public static T FromMessage<T>(CloudQueueMessage m)
            {
                byte[] buffer = m.AsBytes;
                T returnValue = default(T);
                using (MemoryStream ms = new MemoryStream(buffer))
                {
                    ms.Position = 0;
                    BinaryFormatter bf = new BinaryFormatter();
                    returnValue = (T)bf.Deserialize(ms);
                }
                return returnValue;
            }
        }
    

    Then a StdQueue (a Queue that is strongly typed):

       public class StdQueue<T> where T : BaseMessage, new()
        {
            protected CloudQueue queue;
    
            public StdQueue(CloudQueue queue)
            {
                this.queue = queue;
            }
    
            public void AddMessage(T message)
            {
                CloudQueueMessage msg =
                new CloudQueueMessage(message.ToBinary());
                queue.AddMessage(msg);
            }
    
            public void DeleteMessage(CloudQueueMessage msg)
            {
                queue.DeleteMessage(msg);
            }
    
            public CloudQueueMessage GetMessage()
            {
                return queue.GetMessage(TimeSpan.FromSeconds(120));
            }
        }
    

    Then, all you have to do is to inherit the BaseMessage:

    [Serializable]
    public class ParseTaskMessage : BaseMessage
    {
        public Guid TaskId { get; set; }
    
        public string BlobReferenceString { get; set; }
    
        public DateTime TimeRequested { get; set; }
    }
    

    And make a queue that works with that message:

    CloudStorageAccount acc;
                if (!CloudStorageAccount.TryParse(connectionString, out acc))
                {
                    throw new ArgumentOutOfRangeException("connectionString", "Invalid connection string was introduced!");
                }
                CloudQueueClient clnt = acc.CreateCloudQueueClient();
                CloudQueue queue = clnt.GetQueueReference(processQueue);
                queue.CreateIfNotExist();
                this._queue = new StdQueue<ParseTaskMessage>(queue);
    

    Hope this helps!