2013-08-21 3 views
2

Вот тест: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; } 
} 

Я ожидал, что содержание Даты быть отображается, но вот фактический результат:

11/05/1994 13:15:30 

Итак, MassTransit просто пытается конвертировать каждую строку, которую он получил в Dat eTime, а затем отформатировать его так, как он хочет, или что?

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

Вывод представляет собой строку «как есть», поэтому кажется, что проблема не в сериализаторе.

+1

«Свойство даты имеет строковый тип» - Почему? –

+0

Предположим, что это данные, полученные мной из внешнего источника, и я хотел бы проанализировать его на типизированный объект через некоторое время. Однако это не относится к моему вопросу. – vorou

+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 ведет себя правильно.

+0

см. Мое обновление. Кроме того, я считаю, что это действительно странное поведение для транспорта для изменения сообщений. Я просто хочу получать мои сообщения точно так, как я их отправил, почему я должен беспокоиться о специфических деталях сериализации? – vorou

+0

Я создал проблему. Если у вас есть что добавить, я бы повесил там. – Travis

Смежные вопросы