我有一个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);
答案 0 :(得分:2)
您可以查看Google Protocol Buffers。协议缓冲区是Google的数据通用语言。以下是Protocol Buffers开发人员指南的摘录:
协议缓冲区是一种灵活,高效,自动化的机制 序列化结构化数据 - 想想XML,但更小,更快,更好 简单。然后,您可以定义一次如何构建数据的结构 您可以使用特殊生成的源代码轻松编写和读取 您的结构化数据往返于各种数据流并使用 各种语言。您甚至可以不用更新数据结构 破坏根据“旧”格式编译的已部署程序。
协议缓冲区比XML更有优势,可用于序列化 结构化数据。协议缓冲区:
- 更简单
- 小3到10倍
- 快20到100倍
- 不那么模糊
- 生成更易于以编程方式使用的数据访问类
醇>
答案 1 :(得分:1)
XML映射可以正常工作。序列化为XML并将其发送出去。你们两边都需要marshallers和unmarshallers。
Java有将JAXB标准用于将XML绑定到对象。如果你遵循这个标准,也许你可以管理它。
答案 2 :(得分:1)
我认为你需要从不同的角度来看待这个问题。首先考虑一下适用于C#和Java端的JSON或XML格式。可以将其视为C#和Android应用之间的API或契约。而不是使用根据自己的格式编组/解组的库,使每一侧的代码读/写您定义的合同。
或者,您可能希望使用二进制格式,如Apache Thrift或Protocol Buffers。