2013-08-16 3 views
3

У меня есть система, в которой сериализованный файл создается с помощью программы C# и затем десериализован в другой программе на C#. Мне интересно, можно ли выполнить двоичную десериализацию файла C# в Java?Deserializing C# Binary в Java

Благодаря

+2

Я не думаю, что java может использовать вывод BinaryFormatter, но вы можете использовать Xml, Json, Protobuf. – I4V

+1

@ I4V: Конечно, Java * может * использовать вывод бинарного форматирования .Net. Это просто, что нет известной реализации ... :) –

+0

@BorisB. Спасибо, я этого не знал :) – I4V

ответ

4

Вы можете попробовать использовать некоторые serializator, который имеет реализации для обеих платформ и выводит данные в кроссплатформенных формате, как Protobuf.

Если вам нужна полная RPC-сеть между Java и C# -приложением, вы можете перейти на Apache Thrift.

3

Я предполагаю, что вы говорите об объекте, сериализованном с помощью BinaryFormatter. Тогда ответ будет квалифицированным «да», поскольку Java реализует машину Тьюринга. Однако это будет непросто.

В этом случае данные будут в формате, наиболее подходящем для использования средой выполнения .NET, и будут содержать информацию о типах и сборках .NET. Вам нужно будет реализовать свой собственный читатель для этого формата, а затем каким-то образом сопоставить между .NET и Java-типами. (Проект Mono реализует BinaryFormatter, совместимый с .NET, поэтому вы можете использовать their reader implementation в качестве ссылки.)

В качестве альтернативы рассмотрите возможность использования другого формата для сериализации данных, такого как JSON. Это обеспечит вам мгновенную переносимость широкого спектра языков, а также возможность для простой проверки данных людьми.

+0

JSON технически не бинарная сериализация. Возможно, это жизнеспособная альтернатива OP. Просто указывая на это. –

+0

@WilliamMorrison Я никогда не утверждал, что это была двоичная сериализация. OP не указывает, что бинарная сериализация является требованием, они просто спрашивают, возможно ли читать Java-специфический двоично-сериализованный граф объектов C#. – cdhowie

+0

Не то, о чем попросил ОП, вот и все, что я говорю. –

1

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

  1. Использование библиотеки третьей стороной за сериализации, которая работает для C# и Java.

  2. Написать рутину для сериализации каждого объекта. Один в C#, один в Java. Это будет утомительно и трудно поддерживать.

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

Рекомендовать вариант 1, использовать стороннюю библиотеку. Вот две сторонние библиотеки, которые я использовал и очень рекомендую.

Google ProtoBufs

Apache Thrift

0

Вы можете использовать любой кросс-платформенной двоичный формат. Ваши варианты включают в себя, среди прочего:

  • Protobuf
  • BSON (Binary JSON)
  • GZIP

JSON и XML (herrrrp) также варианты, хотя и текстовых единиц.

Другим вариантом будет кодирование данных base64 и декодирование его с другой стороны; хотя вы можете получить огромную полезную нагрузку, потому что она двоичная (вероятно, не очень хорошая идея).

+0

gzip - формат сжатия. Я не вижу, как он вписывается в этот список. Вы имели в виду что-то еще? – leppie

+0

@leppie, если это та же физическая система, GZip в одной программе и разархивировать ее в другую. Разве это не то, что вы хотите? Даже если это сеть, вы можете отправить ее через провод и разархивировать ее с другой стороны. – ashes999