2013-07-31 8 views
3

Возможно ли сериализовать класс/объект на C# и десериализовать его в java. Я хочу сериализовать класс, а не данные XML/JSON. Просьба уточнить.Сериализация в C# и де-сериализация в Java

Thanks

+0

Конечно, возможно, что вы пробовали? – bengoesboom

+2

@Aada, Не уверен, можете ли вы это сказать, но почему бы вам не использовать 'XML' или' JSON'. Я просто хочу убедиться, что это не будет в случае проблемы [XY] (http://mywiki.wooledge.org/XyProblem). –

+0

@SteveP. хорошая ссылка на XY, никогда не видел этого. –

ответ

5

Я вижу 3 варианта здесь. Я предлагаю вариант 1, Protobufs.

Посмотрите в ProtoBufs Google,

Или какой-нибудь эквивалент. Вот java version. Вот C# port.

Protobufs предназначенный для такого рода общения. Его двоичный, маленький, быстрый и языковой агностик.

Также имеет обратную совместимость, поэтому, если вы измените сериализованные объекты в будущем, вы все равно сможете их прочитать. Эта функция также прозрачна для вас, если вы пишете код, понимая, что новые переменные могут отсутствовать при несериализованных старых объектах. Это огромное преимущество!

Реализация сериализации по умолчанию одного языка в другой

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

Запишите свои сериализации процедуры вручную

Это, безусловно, будет быстро, но утомительно, более подвержены ошибкам, труднее поддерживать, менее гибкий ...

Here's some benchmarks для библиотек, как ProtoBufs. Это должно помочь вам выбрать лучший вариант для вашего случая использования.

+0

Привет, Уиллэм, спасибо за ваш ответ. Позвольте мне попробовать – Aada

+0

Привет, Уилл, я пытаюсь понять протокол-буфер, но не нашел хороших учебников, я попробовал что-то вроде этого: http://stackoverflow.com/questions/18063793/how-to-de- сериализовать-на-файл-в-Java-на-используя протокольный буфер. Пожалуйста, предложите. – Aada

+0

сделаю. Примите и закройте этот вопрос, как только вы начали новый? –

1

Мы сделали это некоторое время назад, это сработало после многократного перебора, это действительно зависит от кодирования байтов, я думаю, что JAva использует один, а C# использует другой (маленький конец или большой endian), поэтому вам нужно будет реализовать десериализатор что учитывает это. надеюсь, это поможет

+1

Моя компания должна была решить эту же проблему, к счастью, мы использовали собственный протокол, а не встроенную сериализацию любого языка. Было ощущение, что в противном случае было бы грубо. +1 для вашей борьбы. –

+0

Спасибо, мы все сражаемся напуганы :) Этот материал protobuff выглядит многообещающим, но я предполагаю, что у него будут свои демоны. –

+0

Я уверен, что ты прав, хотя мне посчастливилось не встречаться. –

0

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

0

Рассмотрите стандартный CORBA IIOP OMG.

В то время как вам не нужна полноценная поддержка «удаленного объекта» CORBA, IIOP является базовым двоичным протоколом для «движущихся объектов, нейтральных по языку» (таких как параметр значения объекта) по проводу.

  • Для Java: Java EE EJB основаны на IIOP, существует RMI-IIOP; различные библиотеки поддержки. IDL-to-Java compiler поставляется с JDK.

  • Для C# МИОП & интеграции с Java EE см IIOP.NET

1

Как и другие предложили, ваши варианты будут внешние сериализации библиотеки (Google Protobuff, Apache Thrift и т.д.), или просто использовать что-то встроенный, который медленнее/менее эффективен по пропускной способности (JSON, XML и т. д.). Вы также можете написать свой собственный, но поверьте мне, это кошмар для обслуживания.

0

Вы также можете рассмотреть BSON, который используется MongoDB. Если все ваши программы на C#/Java взаимодействуют с базой данных mongodb, вы можете сохранить там свои объекты и прочитать их с помощью соответствующего драйвера.

Что касается самого BSON, см. BSON and Data Interchange в блоге mongoDB.

Смежные вопросы