【发布时间】: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