0

在 C# 和 Android 的 Java 之间对一些自定义数据进行二进制序列化/反序列化的最简单方法是什么?我想为 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);
4

3 回答 3

2

在 Java 中,所有原始类型都是有符号的(奇怪的是甚至是字节!)。因此,如果您想在 Java 中使用DataInputStream.readInt(). 另请注意, readInt() 使用大端。您可以使用 Jon Skeets MiscUtils的 EndianBinaryReader 之类的东西来编写这些,以便可以在 Android 上读取。

UTF-8 有点棘手,因为DataInputStream它使用称为 MUTF-8 (Modified UTF-8) Encoding 的字符串编码。在我们用于在 android 和 .net 之间共享数据的代码中,我们使用一个简单的运行长度编码的 UTF-8 字节来表示一个字符串(-1 为空)。我们在 Java 中的 reader 方法看起来像这样从 C# BinaryWriter 读取标准 UTF-8 编码的字符串(在第一次写出 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");
 }
于 2011-08-30T02:52:23.927 回答
0

这些库中的任何一个都满足您的需求吗?:

  • Protocol Buffers - “Protocol Buffers 是一种以高效且可扩展的格式对结构化数据进行编码的方式。Google 几乎将 Protocol Buffers 用于其所有内部 RPC 协议和文件格式。”

  • Apache Thrift - “Thrift 是一个用于可扩展的跨语言服务开发的软件框架。它将软件堆栈与代码生成引擎相结合,以构建在 C++、Java、Python、PHP、Ruby、Erlang、Perl、 Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk 和 OCaml。”

于 2011-08-29T22:47:59.537 回答
0

几天前,我也面临同样的情况。这是我的解决方案,试试这个(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());
}
于 2012-03-22T09:01:23.840 回答