2013-08-21 1 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" 
        }); 

가 여기 내 주문 클래스의 (날짜 속성은 문자열 유형입니다!) :

public class Order 
{ 
    public string Date { get; set; } 
} 

내가 할 일의 내용을 예상 표시되지만 실제 출력은 다음과 같습니다.

11/05/1994 13:15:30 

따라서 MassTransit은 수신 한 모든 문자열을 Dat eTime을 누른 다음 원하는 방식으로 형식을 지정합니다.

UPD : Json 대신 XmlSerializer를 사용하여 문제를 해결하지 못했습니다. 여기에 메시지의 부분은 내가 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); 

출력은 "있는 그대로"의 문자열이므로 serializer에는 문제가없는 것으로 보입니다.

+1

"날짜 속성은 문자열 유형 임"- 이유가 무엇입니까? –

+0

외부 소스에서받은 데이터를 나타내는 것으로 가정하고 나중에 입력 된 객체로 파싱하고 싶습니다. 그러나 제 질문과 관련이 없습니다. – vorou

+0

당신이 그것이 관련되어 찾을 것 같아 .... –

답변

2

대량 전송 문제가 발생했습니다 (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; } 
} 

참고 : MT가 JSON.NET을 사용하여 XML을 역 직렬화하기 때문에 XML도 실패합니다. 대부분의 XML 시리얼 라이저보다 훨씬 빠릅니다. BSON, Binary 또는 VersionOneXml을 사용하면 모두 올바르게 작동합니다.

+0

내 업데이 트를 참조하십시오. 또한, 이것은 메시지가 메시지를 변경하는 전송에 대해 실제로 이상한 동작이라고 생각합니다. 난 단지 내가 보낸 메시지와 정확히 같은 방식으로 메시지를 받기를 원한다. – vorou

+0

문제가 발생했습니다. 추가 할 것이 더있는 경우, 거기에 무게가 나가게 될 것입니다. – Travis