Проблемы сериализации служебной шины Azure [C#/JAVA]

У меня есть некоторые проблемы с сериализацией в кросс-платформе С# и Java:

У нас есть 2 приложения, использующие ServiceBus, одно C # и одно JAVA. Допустим, C# отвечает за публикацию данных в очередь/тему, а JAVA подписывается на нее.

В C# мы используем стандартный метод публикации, который позволяет публиковать универсальные типы, поэтому он автоматически сериализует данные, отправленные с классом TypeA.

Затем в java у нас есть закодированный эквивалент TypeA, но мы не можем найти API-десериализатор, который может десериализовать объект в наш .

Есть ли какой-либо действительный десериализатор для JAVA или мы должны сериализовать (например, с помощью JSON) в С#, опубликовать его и десериализовать в JAVA с помощью любого десериализатора JSON?

Заранее спасибо!


person Pizerg    schedule 09.04.2013    source источник


Ответы (4)


Я считаю, что один из DataContractSerializers будет использоваться, если вы ничего не сделаете с BrokeredMessage. Вы не показали никакого кода, но я предполагаю, что вы используете класс BrokeredMessage. Если вам нужна кроссплатформенность, вам нужно контролировать сериализацию. Я бы сериализовал в JSON и либо передал JSON в виде строки, либо использовал перегрузку потока и, возможно, сжал поток, передав его в конструктор (если это был большой объект). Клиент Java должен будет получить десериализатор JSON и сделать обратное.

Как вы уже поняли, DataContractSerializer не так легко обратим в Java. Я уверен, что вы могли бы это сделать, но использование JSON или protobuf намного проще и кроссплатформеннее.

person dunnry    schedule 09.04.2013

Для межъязыковой двоичной сериализации обратитесь к этому вопросу. Однако в этом случае я бы использовал JSON - я думаю, это было бы намного проще.

person Zim-Zam O'Pootertoot    schedule 09.04.2013

Я предполагаю, что ответ относится к вашей существующей кодовой базе. Наиболее ортодоксальным способом было бы использование XmlSerializer на C# и JAXB на Java. Конечно, вам потребуется ручная проверка кода на обоих языках, чтобы обеспечить полную совместимость.

Я думаю, что оба языка поддерживают несколько способов сериализации/десериализации, вам просто нужно найти тот, который совместим друг с другом.

person Albert Cheng    schedule 10.04.2013

  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();
    
person Paulius Zaliaduonis    schedule 30.07.2014