我在c#和java跨平台的序列化方面遇到了一些问题:
我们有2个使用ServiceBus的应用程序,一个C#和一个JAVA。让我们说C#负责将数据发布到队列/主题,而JAVA正在订阅它。
在C#中,我们使用标准的发布方法,该方法允许泛型类型发布,因此它会自动序列化使用TypeA类发送的数据。
然后在java中我们有TypeA等效编码,但找不到任何可以反序列化对象的API-Deserializer。
JAVA是否有任何有效的反序列化器,或者我们必须在C#中序列化(例如使用JSON),使用任何JSON反序列化器在JAVA中发布和反序列化?
提前致谢!
答案 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)
在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();