0

我在 c# 和 java 跨平台中的序列化有一些问题:

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

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

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

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

提前致谢!

4

4 回答 4

1

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

正如您所知道的 - DataContractSerializer 在 Java 中不容易逆转。我相信你可以做到,但使用 JSON 或 protobuf 是一种更简单且跨平台的方式。

于 2013-04-09T15:03:53.363 回答
0

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

于 2013-04-09T15:02:42.633 回答
0

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

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

于 2013-04-10T00:20:23.127 回答
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();
    
于 2014-07-30T15:44:33.967 回答