2013-04-09 89 views
0

我有一些问题,在C#和Java的跨平台序列化:Azure的服务总线序列化问题[C#/ JAVA]

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

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

然后在Java中,我们有相当的类型A编码,但无法找到任何API - 解串器,可以反序列化对象给我们。

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

在此先感谢!

回答

0

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

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

0

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

0

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

我认为这两种语言支持序列化/反序列化的多种方式,你只需要找到一个是彼此兼容。

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