Problems serializing class with float[,] property

I am receiving a reflection error will serializing a class that is the body of MSMQ body. Messages is "There was an error reflecting type 'SSPW.ThermalMonitor.Interfaces.RawImage'." I have many other classes going out over the same queue without problems. The serialization error is occuring on the Pixels property is a 2D float array (float[,]). I have verified this by adding the XmlIgnoreAttribute()] to the Pixels property. In this case the message is serialized and sent successfully.

What do i have to do to serialize a simple typed 2D array? My message body class in given below.


using System;
using System.Xml.Serialization;
 
namespace SSPW.ThermalMonitor.Interfaces
{
    [Serializable]
    public class RawImage
    {
        protected string _handle;
        protected int _width;
        protected int _height;
        protected float[,] _pixels;
        protected DateTime _timestamp;
        
        public RawImage()
        {
            _handle = "";
            _width = 320;
            _height = 240;
            _pixels = new float [_width,_height];
            _timestamp = DateTime.Now;
        }
 
        public String Handle
        {
            get
            {
                return _handle;
            }
            set
            {
                _handle = value;
            }
        }
 
        public int Width
        {
            get
            {
                return _width;
            }
            set
            {
                _width = value;
            }
        }
 
        public int Height
        {
            get
            {
                return _height;
            }
            set
            {
                _height = value;
            }
        }
 
        //[XmlIgnoreAttribute()]
        public float[,] Pixels
        {
            get
            {
                return _pixels;
            }
            set
            {
                _pixels = value;
            }
        }
 
        public DateTime Timestamp
        {
            get
            {
                return _timestamp;
            }
            set
            {
                _timestamp = value;
            }
        }
 
    }
}

Open in new window

cravenjwAsked:
Who is Participating?
 
gregmulvihillConnect With a Mentor Commented:
Give this a try.
using System;
using System.Xml.Serialization;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
 
namespace SSPW.ThermalMonitor.Interfaces
{
	[Serializable]
	public class RawImage
	{
		protected string _handle;
		protected int _width;
		protected int _height;
		protected float[,] _pixels;
		protected DateTime _timestamp;
 
		public RawImage()
		{
			_handle = "";
			_width = 320;
			_height = 240;
			_pixels = new float[_width, _height];
			_timestamp = DateTime.Now;
		}
 
		public String Handle
		{
			get { return _handle; }
			set { _handle = value; }
		}
 
		public int Width
		{
			get { return _width; }
			set { _width = value; }
		}
 
		public int Height
		{
			get { return _height; }
			set { _height = value; }
		}
 
		[XmlIgnoreAttribute()]
		public float[,] Pixels
		{
			get { return _pixels; }
			set { _pixels = value; }
		}
 
		[XmlElementAttribute("Pixels")]
		public byte[] PixelsByteArray
		{
			get
			{
				if (_pixels != null)
				{
					MemoryStream oMemoryStream = new MemoryStream();
 
					BinaryFormatter oBinaryFormatter = new BinaryFormatter();
					oBinaryFormatter.Serialize(oMemoryStream, _pixels);
 
					byte[] oBytes = oMemoryStream.ToArray();
 
					oMemoryStream.Close();
					oMemoryStream.Dispose();
 
					return oBytes;
				}
				else
				{
					return null;
				}
			}
 
			set
			{
				if (value != null)
				{
					MemoryStream oMemoryStream = new MemoryStream(value);
 
					BinaryFormatter oBinaryFormatter = new BinaryFormatter();
					_pixels = oBinaryFormatter.Deserialize(oMemoryStream) as float[,];
 
					oMemoryStream.Close();
					oMemoryStream.Dispose();
				}
				else
				{
					_pixels = null;
				}
			}
		}
 
		public DateTime Timestamp
		{
			get { return _timestamp; }
			set { _timestamp = value; }
		}
	}
}

Open in new window

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.