C# и Android/Java - кросс-языковые средства записи / чтения двоичных потоков? (для примитивов и строк UTF-8)
Какой самый простой способ выполнить двоичную сериализацию / десериализацию некоторых пользовательских данных между C# и Java Android? Я хотел бы найти для Java что-то похожее на C# BinaryWriter и BinaryReader - который поддерживает написание примитивов (например, uint16) и строк UTF-8.
Или, может быть, есть лучший способ?
редактировать: структура данных не известна во время компиляции
Образец записи:
BinaryWriter w = new BinaryWriter(File.OpenWrite(@"D:\data"));
w.Write((UInt16)1234);
w.Write("To jest żółwiątko");
w.Write((UInt16)4567);
3 ответа
В Java все примитивные типы подписаны (странно четный байт!). Так что вам нужно будет выписать целые числа со знаком, если вы хотите прочитать их в Java, используя DataInputStream.readInt()
, Также обратите внимание, что readInt() использует big-endian. Вы можете использовать что-то вроде EndianBinaryReader от Jon Skeets MiscUtils, чтобы написать их, чтобы их можно было читать на Android.
UTF-8 немного сложнее, чем DataInputStream
для кодирования строк используется кодировка MUTF-8 (Modified UTF-8). В коде, который мы используем для обмена данными между android и.net, мы используем простые байты UTF-8 в кодировке длины строки для представления строки (-1 - ноль). Наш метод чтения в Java выглядит примерно так, чтобы читать стандартные строки в кодировке UTF-8 из C# BinaryWriter (после первой записи длины Int16):
public String readUTF8String() throws ImageFileFormatException, IOException
{
short len = readInt16();
if (len == -1)
return null;
if (len == 0)
return "";
if (len < -1)
throw new ImageFileFormatException("Invalid UTF8 string");
byte[] utf8Bytes = readBytes(len);
return new String(utf8Bytes, "UTF-8");
}
Несколько дней назад я столкнулся с такой же ситуацией. Вот мое решение, попробуйте это (код C#):
public static void WriteUTF(this BinaryWriter writer, string s)
{
short length = (short)Encoding.UTF8.GetByteCount(s);
writer.Write(BitConverter.GetBytes(length).Reverse().ToArray());
writer.Write(s.ToCharArray());
}
Удовлетворяет ли одна из этих библиотек вашим потребностям?:
Буферы протокола - "Буферы протокола - это способ кодирования структурированных данных в эффективный, но расширяемый формат. Google использует буферы протокола почти для всех своих внутренних протоколов RPC и форматов файлов".
Apache Thrift - "Thrift" - это программная среда для масштабируемой межязыковой разработки сервисов. Она объединяет программный стек с механизмом генерации кода для создания сервисов, которые работают эффективно и без проблем между C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Какао, JavaScript, Node.js, Smalltalk и OCaml."