这是测试:
var bus = ServiceBusFactory.New(c =>
{
c.DisablePerformanceCounters();
c.UseRabbitMq();
c.ReceiveFrom("rabbitmq://localhost/qqq");
});
bus.SubscribeHandler((Order o) => Console.WriteLine(o.Date));
bus.Publish(new Order
{
Date = "1994-11-05T13:15:30Z"
});
这是我的Order类(Date属性是字符串类型!):
public class Order
{
public string Date { get; set; }
}
我希望显示日期的内容,但这是实际的输出:
11/05/1994 13:15:30
那么,MassTransit是否只是尝试将接收到的每个字符串都转换为DateTime,然后以所需的方式对其进行格式化,或者呢?
UPD:使用XmlSerializer代替Json不能解决问题。这是我在RabbitMQ中看到的消息部分:
<date>1994-11-05T13:15:30Z</date>
我在应用程序中收到的消息再次以相同的方式更改:
11/05/1994 13:15:30
UPD2:我已经测试了序列化器(Json.NET):
var panda = new Panda
{
Birthday = "1994-11-05T13:15:30Z"
};
Console.Out.WriteLine(JsonConvert.DeserializeObject<Panda>(JsonConvert.SerializeObject(panda)).Birthday);
输出是字符串“ as is”,因此看来问题出在串行器上。
最佳答案
为此创建了一个MassTransit问题:https://github.com/MassTransit/MassTransit/issues/197。
JSON.NET(5.0.6)确实无法正确转换。
[TestFixture]
public class IsoDateSerializationTest
{
[Test]
public void Test()
{
JToken jtoken = JObject.Parse(@"{ IsoDate: ""1994-11-05T13:15:30Z"" }");
Type deserializeType = typeof (MessageWithIsoDate);
JsonSerializer serializer = new JsonSerializer();
object obj;
using (var jsonReader = new JTokenReader(jtoken))
{
obj = serializer.Deserialize(jsonReader, deserializeType);
}
MessageWithIsoDate msg = obj as MessageWithIsoDate;
Assert.That(msg.IsoDate, Is.EqualTo("1994-11-05T13:15:30Z"));
}
}
public class MessageWithIsoDate
{
public String IsoDate { get; set; }
}
注意:XML也会失败,因为MT也会使用JSON.NET来反序列化XML。显然比大多数XML序列化器要快得多。使用BSON,Binary或VersionOneXml都可以正常工作。
关于c# - MassTransit弄乱了我的字符串数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18355009/