通过序列化将数据从c#传输到Java
本文关键字:传输 Java 数据 序列化 | 更新日期: 2023-09-27 18:05:22
我有一个用于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导入库可以处理嵌套类与列表和字典?我设法找到的东西要么在另一个方向,要么只是简单的一个类序列化。
顺便说一句:我也使用元组作为字典键,但如果没有什么可以处理,我就使用嵌套字典,这不是什么大问题。
编辑:因为我不能回答我自己的问题,由于低代表这里是解决方案,为我工作:
所以,我尝试了一些更多的组合和使用JSon序列化。. NET在c#/。. 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);
你可以看看Google Protocol Buffers。协议缓冲区是Google数据的通用语言。以下是协议缓冲区开发人员指南的摘录:
协议缓冲区是一种灵活、高效、自动化的机制序列化结构化数据——考虑XML,但更小、更快、更可靠简单。然后,您只需定义一次数据的结构您可以使用特殊生成的源代码来方便地编写和读取您的结构化数据往返于各种数据流,并使用多种语言。您甚至可以更新您的数据结构破坏按"旧"格式编译的已部署程序。
在序列化方面,协议缓冲区比XML有许多优点结构化数据。协议缓冲区:
- 比
小3到10倍- 速度快20到100倍
- 不那么模糊
- 生成更易于编程使用的数据访问类
XML映射就可以了。序列化为XML并发送过来。在任何一端都需要编组器和反编组器。
Java有自己的JAXB标准来将XML绑定到对象。如果你遵循这个标准,也许你可以做到。我认为你需要从不同的角度来处理这个问题。首先考虑一种JSON或XML格式,它可以很好地与c#和Java端一起工作。可以把它想象成c#和Android应用程序之间的API或契约。与其使用根据自己的格式编组/反编组的库,不如让每一方的代码读/写你定义的契约。
或者,您可能想要使用二进制格式,如Apache Thrift或Protocol Buffers。