2012-02-06 30 views
4

我在MT中發佈了一個消息,它有幾個對象類型的屬性,因爲我不知道編譯時的類型。當我在消費者中收到消息時,我看到,Object-typed屬性用Newtonsoft JObject-instances填充。 JObject-Class駐留在Masstransit.dll中的ILMerged Newtonsoft.Json-程序集中。此程序集中的JObject-Class標記爲內部。每當我嘗試將屬性值轉換爲由Newtonsoft.Json的Nuget-Assembly提供的JObject時,它都會失敗。複雜的消息和Masstransit反序列化

所以我的問題是:

  • 什麼是屬性值轉換爲JObject正確的方法是什麼?
  • 爲什麼演員失敗?這意味着,clr在這裏遇到了哪些困難?
  • 我可以在我的客戶中獲得原始的,非序列化的消息主體嗎?

謝謝。

回答

5

如果您正在對任何消息合約進行運行時輸入,則無法使用JSON序列化。如果你想這樣做,你需要使用二進制串行器。

您不能訪問原始的,反序列化的消息體;如果消息不能被反序列化,則不會調用用戶代碼。

標記爲內部的任何類型都不允許我們反序列化消息。不能調用構造函數,因此不能創建對象。我不確定二進制序列化程序將允許你繞過這個限制,而不是我測試過的。

如果您還有其他問題,歡迎您加入郵件列表https://groups.google.com/forum/#!forum/masstransit-discuss

+0

謝謝你的建議。但不幸的是,即使與最新的Masstransit-NuGet軟件包(心跳,訂閱等)捆綁在一起的消息類型似乎也不適用於BinarySerializer。它們沒有用Serializable屬性裝飾。 – 2012-02-07 09:32:27

+2

請提交問題(或更好的拉請求)以正確裝飾它們,以便二進制序列化工作。 – 2012-02-07 14:17:19

+0

羅傑那!到哪個分支? – 2012-02-07 17:44:56

0

我上面描述的問題可能只是出於對我的消息系統的誤解。但是我發現一個討厭的解決方法,以嵌套JObjects轉換爲正確的域對象:

protected bool TryConvertJObjectToDtoOfType<T>(Object jObjectInDisguise, out T dto) 
    where T: BpnDto 
{ 
    try 
    { 
     if (jObjectInDisguise.GetType().Name != typeof(JObject).Name) 
      throw new ArgumentException("Object isn't a JObject", "jObjectInDisguise"); 

     var json = jObjectInDisguise.ToString(); 
     var settings = new JsonSerializerSettings() 
     { 
      MissingMemberHandling = MissingMemberHandling.Error 
     }; 

     dto = JsonConvert.DeserializeObject<T>(json, settings); 
     return true; 
    } catch 
    { 
     dto = null; 
     return false; 
    } 
} 
2

由於MassTransit的創造者之一,如果你包括

public object MyMessageProperty { get; set; } 

在郵件的合同,你'做錯了。利用框架的強類型發佈功能,而不是在MT內的發佈/訂閱系統已經完成的調度之上進行自己的動態調度。

+0

正如你所看到的,我在我的解決方案中提到我知道,這不是你想要使用多態調度的方式。也就是說,我有類型組合的消息。以類型化的方式表示所有組合將是相當多的消息。 – 2012-02-07 17:38:28

+1

是的,有很多消息,但支持繼承和接口,所以你可以通過利用類型來做更多有趣的事情。您可以開始觀察事件,查看部分消息,而無需(x爲Y)到處。這是做這件事的最好方式,是明確的,故意的與混亂的。當代碼離開您的想法並開始被其他人使用時,這是至關重要的。 – 2012-02-07 18:49:40