【问题标题】:Transferring data from C# to Java via serialization通过序列化将数据从 C# 传输到 Java
【发布时间】:2011-10-26 10:16:06
【问题描述】:

我有一个用于 Android 的 Java 应用程序,其中包含一些静态数据,这些数据将在启动时加载。这些数据由 C# 应用程序生成为带有列表和字典的一堆类,如下所示:

public class DataContainer
{
    public List<A> As = new List<A>();
    public Dictionary<int, B> Bs = new Dictionary<int, B>();
    // ...
}

public class A
{
    public int IdA;
    public int IdSomething;
    public DateTime dt;
    //...
}

public class B
{
    public int IdB;
    public string Name;
    List<C> Cs = new List<C>();
    //...
}

public class C
{
    //...
}

(DataContainer 类是包含所有要传输的数据的根类。然后我希望在其中导入数据的 Java 项目中有一个类似的类结构。)

我的问题是我似乎找不到能够读写相同格式的 .NET 和 Java 工具/库的组合。

我尝试了 JSON 与 DataContractJsonSerializer,然后使用 GSON 加载,但这不适用于字典/地图(适用于列表,但我需要字典)。 .NET 导出器使用如下格式

"Bs":[{"Key":1,"Value":{...}}, ...]

虽然看起来 GSON 使用

{key:value,key:value,...}

我也查看了一些 XML,但由于没有标准格式,所有库默认使用不同的东西,我真的不想手动编写所有的写入/解析规则。此外,与 XML 相比,JSON 的开销要少得多。


那么,是否有一些用于 .NET 导出和 Java 导入的库可以处理带有列表和字典的嵌套类?我设法找到的东西要么在另一个方向,要么只是简单的一个类序列化。

顺便说一句:我也使用元组作为字典键,但如果没有什么可以处理我将使用嵌套字典,这没什么大不了的。


编辑:由于代表人数少,我无法回答我自己的问题,这里是对我有用的解决方案:


因此,我尝试了更多组合并在 C#/.NET 端使用 JSon.NET 进行序列化,然后在 Java 端使用 GSON 加载效果很好,但元组除外。例如,使用 Tuple 作为字典的键将被序列化为:

{ "(False, 3)" : { ... }, "(True, 1)" : { ... }, ... }

所以我现在必须在 Java 中使用字符串键,但这不是问题。可能的解决方案是在 .NET 和 Java 中为 Tuple 编写一个自定义类。

示例代码:

        string serializeObject = JsonConvert.SerializeObject(dataContainer, new IsoDateTimeConverter());
        File.WriteAllText("test.json", serializeObject);

和 Java:

    InputStream is = getResources().openRawResource(R.raw.test); // open from /res/raw/test.json
    Gson gson = new Gson();
    InputStreamReader r = new InputStreamReader(is);
    DataContainer dc = gson.fromJson(r, DataContainer.class);
    Log.i("jsondebug", dc.Packers.get(0).Something);

【问题讨论】:

    标签: c# java android .net serialization


    【解决方案1】:

    XML 映射可以正常工作。序列化为 XML 并发送过来。两端都需要编组器和解组器。

    Java 有用于将 XML 绑定到对象的 JAXB 标准。如果您遵循该标准,也许您可​​以管理它。

    【讨论】:

    • 我认为关键是首先编写 XML 模式。我假设有一些方法可以从 XML 模式生成 C# 代码,而 JAXB 将为 Java 执行此操作。但是,您不能在 Android 上使用 JAXB。选项是手动执行 Java 或使用 simple.sourceforge.net 之类的库
    • 我需要一些可以用最少的设置工作的东西,因为有很多类,它们可能会经常变化。每次都必须在两端修复(反)序列化会很烦人。
    • 如果变化很大,你就会遇到很多麻烦。诀窍是要有一个相对稳定的界面。听起来你的在不断变化。
    【解决方案2】:

    我认为您需要从不同的角度来解决这个问题。首先考虑在 C# 和 Java 端都可以很好地工作的 JSON 或 XML 格式。将其视为 C# 和 Android 应用程序之间的 API 或合同。不要使用根据自己的格式编组/解组的库,而是使每一方的代码读/写到您定义的合同。

    或者,您可能希望考虑使用二进制格式,如 Apache ThriftProtocol Buffers

    【讨论】:

      【解决方案3】:

      你可以看看Google Protocol Buffers。协议缓冲区是 Google 的数据通用语。以下是 Protocol Buffers 开发者指南的摘录:

      协议缓冲区是一种灵活、高效、自动化的机制 序列化结构化数据——想想 XML,但更小、更快、 更简单。您定义一次数据的结构方式,然后 您可以使用特殊生成的源代码轻松编写和阅读 您的结构化数据进出各种数据流,并使用 多种语言。您甚至可以在不更新数据结构的情况下 破坏根据“旧”格式编译的已部署程序。

      在序列化方面,协议缓冲区比 XML 有很多优势 结构化数据。协议缓冲区:

      1. 更简单
      2. 小 3 到 10 倍
      3. 快 20 到 100 倍
      4. 不那么模棱两可
      5. 生成更易于以编程方式使用的数据访问类

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-31
        • 2012-04-09
        相关资源
        最近更新 更多