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反序列化器反序列化?
提前感谢!
我相信,如果您不对BrokeredMessage做任何操作,将使用其中一个DataContractSerializers。您没有显示任何代码,但我假设您正在使用BrokeredMessage类。如果你想跨平台,你需要控制序列化。我将序列化为JSON,并将JSON作为字符串传递,或者使用流重载并可能压缩流,将其传递给构造函数(如果它是一个大对象)。Java客户端需要获得JSON反序列化器并执行相反的操作。
正如您所发现的那样,DataContractSerializer在Java中不容易可逆。我相信你可以做到,但使用JSON或protobuf是一种更容易和跨平台的方式。
对于跨语言二进制序列化,请参考此问题。但是,在这种情况下,我会使用JSON——我相信它会简单得多。
我猜答案与您现有的代码库有关。最正统的方法是在c#上使用XmlSerializer,在Java上使用JAXB。当然,您需要手工检查两种语言的代码,以确保完全的互操作性。
我认为两种语言都支持多种序列化/反序列化方式,你只需要找到一种相互兼容的方式。
-
使用您选择的c#序列化库,而不是默认的契约序列化器。(我将使用JSON和Newtonsoft.json)
-
发布消息为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" });
-
接收json文本流
var message = _subscriptionClient.Receive(); Stream stream = message.GetBody<Stream>(); StreamReader reader = new StreamReader(stream); string s = reader.ReadToEnd();