这是测试:

        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/

10-12 03:07