通过序列化将数据从C#传输到Java

时间:2011-08-13 14:13:11

标签: c# java android .net serialization

我有一个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工具/库的组合。

我已经尝试使用DataContractJsonSerializer进行JSON,然后使用GSON加载,但这不适用于Dictionaries / Maps(与Lists一起工作但我需要字典)。 .NET导出器使用

之类的格式
"Bs":[{"Key":1,"Value":{...}}, ...]

虽然看起来像GSON使用

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

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


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

BTW:我也使用Tuples作为字典键,但如果没有什么可以处理,我只会使用嵌套字典,这不是什么大问题。


编辑:由于低代表我不能回答我自己的问题,这里的解决方案对我有用:


所以,我在C#/ .NET端使用JSon.NET尝试了一些组合和序列化,然后在Java端加载使用GSON很有效,除了Tuples。例如,使用Tuple作为字典的键将被序列化为:

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

所以我现在必须在Java中使用String键,但这不是问题。可能的解决方案是在.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);

3 个答案:

答案 0 :(得分:2)

您可以查看Google Protocol Buffers。协议缓冲区是Google的数据通用语言。以下是Protocol Buffers开发人员指南的摘录:

  

协议缓冲区是一种灵活,高效,自动化的机制   序列化结构化数据 - 想想XML,但更小,更快,更好   简单。然后,您可以定义一次如何构建数据的结构   您可以使用特殊生成的源代码轻松编写和读取   您的结构化数据往返于各种数据流并使用   各种语言。您甚至可以不用更新数据结构   破坏根据“旧”格式编译的已部署程序。

     

协议缓冲区比XML更有优势,可用于序列化   结构化数据。协议缓冲区:

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

答案 1 :(得分:1)

XML映射可以正常工作。序列化为XML并将其发送出去。你们两边都需要marshallers和unmarshallers。

Java有将JAXB标准用于将XML绑定到对象。如果你遵循这个标准,也许你可以管理它。

答案 2 :(得分:1)

我认为你需要从不同的角度来看待这个问题。首先考虑一下适用于C#和Java端的JSON或XML格式。可以将其视为C#和Android应用之间的API或契约。而不是使用根据自己的格式编组/解组的库,使每一侧的代码读/写您定义的合同。

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