2012-07-18 46 views
0

我是新來的人,所以請保持溫柔。MSMQ如何在使用二進制編碼時最好地處理類

這個問題圍繞VB.net/VS2010/MSMQ 4.0

我正在開發,在其心臟有MSMQ的應用程序。有(目前)3個獨立的VB解決方案,每個解決方案發送和接收消息隊列。

我試過使用XMLMessageFormatter並遇到了問題,再加上這是一個高性能,時間關鍵的應用程序,我知道XMLMessaegFormatter的開銷很高,所以我已經切換到使用BinaryMessageFormatter進行消息。

我已經建立了一個類(clsTMessage),它爲消息數據提供結構並駐留在附加到解決方案的自己的.vb文件中。我意識到,使用Binaryformatter的缺點是,完全相同的類(到版本和所有)不得不對編碼和解碼消息,事實上我看到了這個問題。

所以我想,沒問題,我只是將clsTmessage.vb複製到每個解決方案,但是這並不完美,因爲這些消息使用主機組合的命名空間進行編碼,因此需要選擇下一個解決方案這個消息在技術上尋找一個不同的類來解碼它。

例如,在本例中,您可以看到TelemanusWorkbench版本1.0.0.0使用TelemanusWorkbench.clsTMessage對消息進行編碼。

00 01 00 00 00 FF FF FF .....ÿÿÿ 
FF 01 00 00 00 00 00 00 ÿ....... 
00 0C 02 00 00 00 49 54 ......IT 
65 6C 65 6D 61 6E 75 73 elemanus 
57 6F 72 6B 62 65 6E 63 Workbenc 
68 2C 20 56 65 72 73 69 h, Versi 
6F 6E 3D 31 2E 30 2E 30 on=1.0.0 
2E 30 2C 20 43 75 6C 74 .0, Cult 
75 72 65 3D 6E 65 75 74 ure=neut 
72 61 6C 2C 20 50 75 62 ral, Pub 
6C 69 63 4B 65 79 54 6F licKeyTo 
6B 65 6E 3D 6E 75 6C 6C ken=null 
05 01 00 00 00 1E 54 65 ......Te 
6C 65 6D 61 6E 75 73 57 lemanusW 
6F 72 6B 62 65 6E 63 68 orkbench 
2E 63 6C 73 54 4D 65 73 .clsTMes 
73 61 67 65 09 00 00 00 sage.... 
0E 6E 65 77 4D 65 73 73 .newMess 
61 67 65 54 79 70 65 12 ageType. 
6E 65 77 50 72 6F 74 6F newProto 
63 6F 6C 56 65 72 73 69 colVersi 
6F 6E 0D 6E 65 77 49 64 on.newId 
65 6E 74 69 66 69 65 72 entifier 
0B 6E 65 77 53 6F 75 72 .newSour 
63 65 49 50 0D 6E 65 77 ceIP.new 
53 6F 75 72 63 65 50 6F SourcePo 
72 74 10 6E 65 77 44 65 rt.newDe 
73 74 69 6E 61 74 69 6F stinatio 
6E 49 50 12 6E 65 77 44 nIP.newD 
65 73 74 69 6E 61 74 69 estinati 
6F 6E 50 6F 72 74 0C 6E onPort.n 
65 77 54 69 6D 65 73 74 ewTimest 
61 6D 70 0E 6E 65 77 4D amp.newM 
65 73 73 61 67 65 42 6F essageBo 
64 79 01 01 01 01 01 01 dy...... 
01 00 01 0D 02 00 00 00 ........ 
06 03 00 00 00 03 44 46 ......DF 
58 06 04 00 00 00 01 30 X......0 
06 05 00 00 00 0C 30 30 ......00 
30 30 30 30 30 30 30 30 00000000 
30 30 06 06 00 00 00 07 00...... 
30 2E 30 2E 30 2E 30 06 0.0.0.0. 
07 00 00 00 01 30 06 08 .....0.. 
00 00 00 0B 31 39 32 2E ....192. 
31 36 38 2E 31 2E 31 06 168.1.1. 
09 00 00 00 04 35 30 30 .....500 
30 20 46 FE 12 F9 32 CF 0 Fþ.ù2Ï 
88 06 0A 00 00 00 49 70 .....Ip 
2C 31 2C 31 32 33 34 35 ,1,12345 
36 37 38 39 30 31 32 33 6789
34 35 36 37 38 39 2C 31 456789,1 
32 33 34 35 36 37 38 39 23456789 
30 31 32 33 34 35 2C 31,1 
2C 69 6E 74 65 72 6E 65 ,interne 
74 2C 75 73 65 72 6E 61 t,userna 
6D 65 2C 70 61 73 73 77 me,passw 
6F 72 64 2C 30 2C 33 30 ord,0,30 
0B      . 

當我拿起從應用程序內的另一個解決方案/項目的消息,它無法解析,即使它有clsTMessage的命名空間TelemanusListener.clsTMessage相同的副本它的消息。

鑑於通常在應用程序的不同部分都有該類的多個副本是一個不好的主意,無論如何,在這個應用程序的不同部分有多個副本,請問有什麼建議?我已經閱讀了MSDN對此的評論,但是如何真正實現它卻非常薄弱。

希望我已經解釋得很清楚,如果不是,請詢問更多信息。

Duncan

+0

好的,我想我現在就明白了。 真是一個菜鳥錯誤,我把這個類轉換成了一個類庫,並且從需要訪問TMessage類的成員的應用程序的每個元素中添加了對這個.dll的引用。 我想那是什麼類庫是真的;-) 進一步的意見表示讚賞,但否則這可能會幫助別人沿着這條路走下去。 鄧肯 – user1534578 2012-07-18 14:31:02

回答

0

是的。一個具有公共消息類型的類庫需要從兩個項目中引用。

有關自動屬性的警告 - 不要在需要序列化/反序列化的類中使用它們。每次將類類型編譯到程序集中時,編譯器都會爲每個自動屬性創建一個隨機名稱的後臺字段。當您在不同的項目中部署不同時間編譯的同一個類庫時,這可能會導致序列化問題。

相關問題