Azure服务总线序列化问题[c# / JAVA]

本文关键字:JAVA 问题 服务 总线 序列化 Azure | 更新日期: 2023-09-27 18:08:09

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

我们有两个应用程序使用ServiceBus,一个c#和一个JAVA。让我们假设c#负责向队列/主题发布数据,而JAVA正在订阅它。

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

然后在java中我们有等价的TypeA代码,但是找不到任何api反序列化器可以将对象反序列化为。

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

提前感谢!

Azure服务总线序列化问题[c# / JAVA]

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

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

对于跨语言二进制序列化,请参考此问题。但是,在这种情况下,我会使用JSON——我相信它会简单得多。

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

我认为两种语言都支持多种序列化/反序列化方式,你只需要找到一种相互兼容的方式。

  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();