2013-04-09 79 views
0

我有一些問題,在C#和Java的跨平臺序列化:Azure的服務總線序列化問題[C#/ JAVA]

我們使用ServiceBus 2級的應用程序,一個C#一個和JAVA之一。假設C#負責將數據發佈到隊列/主題,並且JAVA正在訂閱它。

在C#中,我們使用標準的發佈方法,它允許泛型類型的發佈,因此自動序列與類型A類發送的數據。

然後在Java中,我們有相當的類型A編碼,但無法找到任何API - 解串器,可以反序列化對象給我們。

是否有JAVA任何有效的解串器或者我們必須在C#(使用JSON例如)序列,將其發佈在JAVA與任何JSON序列化解串器?

在此先感謝!

回答

0

我相信,如果你不這樣做的任何事情BrokeredMessage的DataContractSerializers的一個將被使用。你沒有顯示任何代碼,但我假設你正在使用BrokeredMessage類。如果你想跨平臺,你需要控制序列化。我會序列化爲JSON並將JSON作爲字符串傳遞,或者使用流重載並可能壓縮流,並在構造函數中傳遞它(如果它是一個大對象)。 Java客戶端需要獲得JSON解串器,然後做相反的事情。

正如你已經想通了 - DataContractSerializer的是不容易逆轉在Java中。我相信你可以做到這一點,但使用JSON或protobuf是一種更簡單和跨平臺的方式。

0

對於跨語言二進制序列化,refer to this question。但是,在這種情況下,我會使用JSON - 我相信它會簡單得多。

0

我想答案是關於你現有的代碼庫。最正統的方法是在C#上使用XmlSerializer,在Java上使用JAXB。當然,您需要使用這兩種語言的代碼手動檢查以確保完全的互操作性。

我認爲這兩種語言支持序列化/反序列化的多種方式,你只需要找到一個是彼此兼容。

0
  1. 在C#中使用您選擇的序列化庫,而不是默認合約序列化程序。 (我將使用JSON和Newtonsoft.json)

  2. 發佈消息作爲JSON文本流

    var json = Newtonsoft.Json.Linq.JObject.FromObject(yourSerializableObject).ToString(); 
        var stream = new MemoryStream(); 
        var writer = new StreamWriter(stream); 
        writer.Write(json); 
        writer.Flush(); 
        stream.Position = 0; 
        _topicClient.Send(new BrokeredMessage(stream, true) { ContentType = "application/json" }); 
    
  3. 接收消息作爲JSON文本流

    var message = _subscriptionClient.Receive(); 
        Stream stream = message.GetBody<Stream>(); 
        StreamReader reader = new StreamReader(stream); 
        string s = reader.ReadToEnd();