Azure Service Bus序列化问题[C#/ JAVA]

时间:2013-04-09 14:51:50

标签: c# java serialization azure servicebus

我在c#和java跨平台的序列化方面遇到了一些问题:

我们有2个使用ServiceBus的应用程序,一个C#和一个JAVA。让我们说C#负责将数据发布到队列/主题,而JAVA正在订阅它。

在C#中,我们使用标准的发布方法,该方法允许泛型类型发布,因此它会自动序列化使用TypeA类发送的数据。

然后在java中我们有TypeA等效编码,但找不到任何可以反序列化对象的API-Deserializer。

JAVA是否有任何有效的反序列化器,或者我们必须在C#中序列化(例如使用JSON),使用任何JSON反序列化器在JAVA中发布和反序列化?

提前致谢!

4 个答案:

答案 0 :(得分:1)

我相信如果您不对BrokeredMessage做任何事情,将使用其中一个DataContractSerializers。您没有显示任何代码,但我假设您使用的是BrokeredMessage类。如果您想要跨平台,则需要控制序列化。我将序列化为JSON并将JSON作为字符串传递,或者使用流重载并可能压缩流,在构造函数中传递它(如果它是一个大对象)。 Java客户端需要获取JSON反序列化器并执行相反的操作。

正如您已经想到的那样 - 在Java中,DataContractSerializer并不容易逆转。我相信你可以做到,但使用JSON或protobuf是一种更容易和跨平台的方式。

答案 1 :(得分:0)

对于跨语言二进制序列化,refer to this question。但是,我会在这种情况下使用JSON - 我相信它会更简单。

答案 2 :(得分:0)

我猜答案与您现有的代码库有关。最正统的方法是在C#上使用XmlSerializer,在Java上使用JAXB。当然,您需要手动检查两种语言的代码,以确保完全的互操作性。

我认为两种语言都支持多种序列化/反序列化方式,您只需要找到彼此兼容的方法。

答案 3 :(得分: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();