Сериализация объекта Java и десериализация в C#

Я пишу приложение, которое требует, чтобы многие переменные состояния передавались из java в С#. Для этого мне нужно сериализовать весь объект, а затем каким-то образом десериализовать его на С# и инициировать соответствующий объект на С#. Это возможно?

Могу ли я использовать сериализацию Java по умолчанию для этой цели? Если да, то как?

PS: рассматриваемый объект относится к абстрактному классу. Класс, расширяющий этот абстрактный класс, должен быть сериализован, и его определение может варьироваться в зависимости от предпочтений пользователя.

PPS: После того, как меня бесчисленное количество раз перенаправляли на страницу разработчиков Google, я подумываю об использовании WOX (в основном потому, что он чрезвычайно «прост в использовании»), но он кажется довольно устаревшим, и за последние несколько лет не было новых обновлений. Есть ли альтернатива с сопоставимой простотой использования?


person Smit    schedule 24.10.2016    source источник
comment
Вероятно, лучше сериализовать в промежуточный формат, такой как XML или JSON.   -  person Robby Cornelissen    schedule 24.10.2016
comment
stackoverflow.com/ вопросы/7183287/   -  person Lokesh Pandey    schedule 24.10.2016


Ответы (3)


Могу ли я использовать сериализацию Java по умолчанию для этой цели?

Что означает сериализация Java по умолчанию, является ли она двоичной или текстовой. Если это двоичный файл, то нет, вы не можете из-за разных двоичных стандартов между двумя фреймворками, Java (байт-код), .Net (IL). Сделать их совместимыми будет непросто. Если его текст, такой как Json, Xml или может быть настраиваемым текстовым форматом, тогда это будет легко осуществимо, и это то, что веб-службы и Rest API используют для связи между различными системами, они используют сериализацию на основе текста по Http в качестве транспортного протокола.

Веб-службы — Soap (Http + Xml), Json модифицирован и не является частью исходной спецификации.

Rest API – Http + Json/Xml, фактически легко интегрируется с Java-скриптом.

person Mrinal Kamboj    schedule 24.10.2016
comment
Насколько я понял, он бинарный. - person Smit; 24.10.2016

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

Чтобы переместить экземпляр класса из java в c#, ​​вам необходимо собрать все свойства класса java и использовать их для создания экземпляра нового объекта c#.

Вы можете сделать это вручную или использовать какой-нибудь помощник, например буферы протокола Google.

Изменить: Пример для protobuf: Protobuf может просто хранить ваши данные, а не логику вашего класса. Он не знает объектно-ориентированных концепций. Абстрактный класс Java можно перевести следующим образом:

Javaкласс:

abstract class Abs{
   int i;
}
class Real extends Abs{
   int k;
}

Протобаф:

message Abs{
    optional int32 i = 1;
}
message Real{
    optional Abs   base = 1;
    optional int32 k    = 2;
}
person david    schedule 24.10.2016
comment
Думаю, с protobuf мне придется написать файл .proto. Как мне это сделать для абстрактного класса? - person Smit; 24.10.2016
comment
В вашем примере кажется, что мне нужно будет заранее знать все поля в классе Real, что невозможно в моем случае, если только я не буду писать новый файл .proto каждый раз, когда кто-то дает мне новый файл Real. - person Smit; 24.10.2016
comment
Если у вас много разных классов, вы должны делегировать им сериализацию. Создайте интерфейс с методами сериализации/десериализации и позвольте им создать xml-файл или что-то еще. Вы также можете попытаться создать общий protobufmessage с множеством повторяющихся и необязательных полей. - person david; 24.10.2016
comment
Возможно, вам следует попытаться создать один класс, который может обрабатывать все пользовательские настройки. - person david; 24.10.2016

Вы можете преобразовать свой объект в xml, а затем передать xml в С#, и там снова xml можно преобразовать в объект С# или данные, полученные другими способами.

person gladiator    schedule 25.10.2016