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

rha*_*007 2 .net c# msmq xml-serialization

我尝试将序列化数据发送到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);
     }
Run Code Online (Sandbox Code Playgroud)

记录:

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

建议:我认为这个错误是由于"typeof"而发生的,但我不确定在那方面.

小智 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);
    }
 }
Run Code Online (Sandbox Code Playgroud)

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

这对我有用.