dlr*_*as2 1 c# msmq tostring xml-serialization character-encoding
我正在探索MSMQ服务,我编写了一个简单的控制台客户端 - 服务器应用程序,它将每个客户端的击键发送到服务器.只要打一个控制字符(DEL,ESC,INS等)服务器理解抛出一个错误.但是,每当我键入空格字符时,服务器都会收到数据包,但不会抛出错误,也不会显示空格.
服务器:
namespace QIM
{
class Program
{
const string QUEUE = @".\Private$\qim";
static MessageQueue _mq;
static readonly object _mqLock = new object();
static XmlSerializer xs;
static void Main(string[] args)
{
lock (_mqLock)
{
if (!MessageQueue.Exists(QUEUE))
_mq = MessageQueue.Create(QUEUE);
else
_mq = new MessageQueue(QUEUE);
}
xs = new XmlSerializer(typeof(string));
_mq.BeginReceive(new TimeSpan(0, 1, 0), new object(), OnReceive);
while (Console.ReadKey().Key != ConsoleKey.Escape) { }
}
static void OnReceive(IAsyncResult result)
{
Message msg;
lock (_mqLock)
{
try
{
msg = _mq.EndReceive(result);
Console.Write(".");
Console.Write(xs.Deserialize(msg.BodyStream));
}
catch (Exception ex)
{
Console.Write(ex);
}
}
_mq.BeginReceive(new TimeSpan(0, 1, 0), new object(), OnReceive);
}
}
}
Run Code Online (Sandbox Code Playgroud)
客户:
namespace QIM_Client
{
class Program
{
const string QUEUE = @".\Private$\qim";
static MessageQueue _mq;
static void Main(string[] args)
{
if (!MessageQueue.Exists(QUEUE))
_mq = MessageQueue.Create(QUEUE);
else
_mq = new MessageQueue(QUEUE);
ConsoleKeyInfo key = new ConsoleKeyInfo();
while (key.Key != ConsoleKey.Escape)
{
key = Console.ReadKey();
_mq.Send(key.KeyChar.ToString());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
客户输入:
测试,测试......
服务器输出:
.Testing ..测试.....
您会注意到空格字符发送消息,但不显示该字符.
你的问题不在于MSMQ,而是在XmlSerializer课堂上.看到:
var key = Console.ReadKey();
XmlSerializer s = new XmlSerializer(typeof(string));
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
s.Serialize(ms, key.KeyChar.ToString());
ms.Position = 0;
var foo = (string)s.Deserialize(ms);
}
Run Code Online (Sandbox Code Playgroud)
如果在控制台中键入空格,您将看到key.KeyChar.ToString()收益率" ",但foo等于"".由于默认实现XmlReader,XmlSerializer该类认为只有空格的字符串为空; 如果字符串包含任何其他字符,则保留前导和尾随空格.空格确实被序列化,但是反序列化将它变成一个空字符串.
请改用:
Console.Write(
s.Deserialize(System.Xml.XmlReader.Create(msg.BodyStream,
new System.Xml.XmlReaderSettings()
{
IgnoreWhitespace = false
})));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
644 次 |
| 最近记录: |