向MSMQ发送序列化数据时抛出InvalidCastException

时间:2014-09-02 06:09:59

标签: c# xml-serialization msmq .net

我尝试将序列化数据发送到MSMQ,但得到" System.InvalidCastException:指定的强制转换无效。"错误。我把我的发送方法和日志跟随。请建议我解决此错误。

    // Here MyMessage is my class which contain some
    // stuff which I want to pass to MSMQ.
    public void Send(MyMessage myMessage)
    {
        XmlSerializer ser = new XmlSerializer(typeof(MyMessage));
        StringBuilder sb = new StringBuilder();

        using (StringWriter writer = new StringWriter())
        {
            ser.Serialize(writer, myMessage);

            Debug.WriteLine(writer.ToString());
        }
      Message _myMessage = new Message(myMessage, new BinaryMessageFormatter());
      //_messageQueue is object of MSMQMessage
      _messageQueue.Send(_myMessage);
     }

记录:

System.InvalidCastException:指定的强制转换无效。"    在MyClassName.Send(MyMessage myMessage)

建议:我认为这个错误是由于" typeof"但我不确定那方面。

2 个答案:

答案 0 :(得分:7)

我知道我迟到了,但今天我遇到了同样的问题并解决了它。由于它是谷歌弹出窗口的第一个链接之一,我将分享我的解决方案。

在您的代码中,您使用的是全局消息队列变量。 Send方法不是线程安全的,因此如果您有多个尝试使用同一对象发送消息的线程,则可能会出现此类错误。

一种解决方案是使用锁定功能

// Here MyMessage is my class which contain some
// stuff which I want to pass to MSMQ.
public void Send(MyMessage myMessage)
{
    XmlSerializer ser = new XmlSerializer(typeof(MyMessage));
    StringBuilder sb = new StringBuilder();

    using (StringWriter writer = new StringWriter())
    {
        ser.Serialize(writer, myMessage);

        Debug.WriteLine(writer.ToString());
    }
    Message _myMessage = new Message(myMessage, new BinaryMessageFormatter());
    //_messageQueue is object of MSMQMessage
    lock(_objlck)
    {
        _messageQueue.Send(_myMessage);
    }
 }

另一个选择是在每个线程中都有一个MessageQueue的新实例。

这对我有用。

答案 1 :(得分:1)

将[Serializable]属性设置为Audit Message。