MassTransit正在搞乱我的字符串数据

时间:2013-08-21 10:28:34

标签: c# string datetime serialization masstransit

以下是测试:

        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);

输出是“原样”的字符串,所以似乎问题不在于序列化器。

1 个答案:

答案 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都表现正常。