以下是测试:
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; }
}
我希望显示Date的内容,但这是实际输出:
11/05/1994 13:15:30
那么,MassTransit是否只是尝试将他收到的每个字符串转换为DateTime,然后按照它想要的方式格式化,或者是什么?
UPD :使用XmlSerializer代替Json并没有解决问题。这是我在RabbitMQ中看到的消息部分:
<date>1994-11-05T13:15:30Z</date>
我在app中收到的消息再次以同样的方式被更改:
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);
输出是“原样”的字符串,所以似乎问题不在于序列化器。
答案 0 :(得分:2)
为它创建了一个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都表现正常。