Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有一种标准/成熟的方法来序列化Java类以用于C++;不使用XML或JSON等标记格式?_Java_C++_Object_Serialization - Fatal编程技术网

是否有一种标准/成熟的方法来序列化Java类以用于C++;不使用XML或JSON等标记格式?

是否有一种标准/成熟的方法来序列化Java类以用于C++;不使用XML或JSON等标记格式?,java,c++,object,serialization,Java,C++,Object,Serialization,我正在从事一个项目,该项目最终将涉及总计数十亿个字段的Java对象,一些后台计算表明,对于这种长度的输入,标准序列化技术将很快变得难以处理(想想一个20Gig的JSON文件)。有其他已知的技术吗?您可以为Java对象编写可序列化的自定义实现。我可能会使用Sun的XDR格式。它是二进制的,因此图1/3将基于文本的格式的大小作为大小的起点。虽然它们(不属于我的知识)包含在java发行版中,但有一些库可以在爪哇和C++中生成/读取这种格式。自从它在Sun的ONC RPC中使用以来,该协议(以及至少一些

我正在从事一个项目,该项目最终将涉及总计数十亿个字段的Java对象,一些后台计算表明,对于这种长度的输入,标准序列化技术将很快变得难以处理(想想一个20Gig的JSON文件)。有其他已知的技术吗?

您可以为Java对象编写可序列化的自定义实现。

我可能会使用Sun的XDR格式。它是二进制的,因此图1/3将基于文本的格式的大小作为大小的起点。虽然它们(不属于我的知识)包含在java发行版中,但有一些库可以在爪哇和C++中生成/读取这种格式。自从它在Sun的ONC RPC中使用以来,该协议(以及至少一些库实现)已经过多年的大量测试。它在中也是标准化的,因此您可以根据自己的需要独立于Oracle
如果您有一个对象集合,并且不希望收到一条消息(如大xml),那么它可能会起作用。

您可以定义一些ASN.1语法,并使用常见的编码规则(如DER、PER等)对数据进行编码/解码

这种灵活的表示法用于TCP上最常见的协议,如LDAP。这可能是沟通不同平台的最有效方式,但您必须学习一些asn.1基础知识并定义语法。然后在java中实现封送器/解列器,也可以在C++中实现。

您可以尝试ASN.1(是的,我知道这里已经有人提出了这个建议,但我还有一些其他信息要补充)。由于您关心的是数据的大小,请注意,电话运营商在处理电话计费时(无论是通过陆地线路还是移动电话)使用ASN.1来处理其CDR(呼叫数据记录)。他们将成百上千的通话记录捆绑成一条信息,发送到计费中心

我的建议是使用PER(打包编码规则),该规则最初是为航空业设计的,因为它们需要最小化空对地通信中的带宽。PER随后被移动电话行业接受,目前它是许多3G和4G协议的一部分

PER的目标是避免通过通信双方都知道的线路发送信息。因此,例如,如果字段具有固定长度,则无需在消息中发送该长度。如果一个值有一个范围,例如从5000到5007,那么只有8个可能的值,因此只有3位将用于表示该值。这就是PER实现如此紧凑的部分原因

最后,使用一个好的ASN.1工具使您不必担心上一段中提到的细节。所有你需要做的就是创建ASN 1规范,描述你想交换的信息(这是很容易做到的——看到),选择你的编程语言(C,C++,爪哇,C是一些常见的,但是其他的也可以在一些ASN.1工具中使用)。然后使用ASN.1编译器为您生成序列化器/反序列化器引擎。注意,既然ASN.1本身与使用的编程语言无关,那么您可以很容易地在C++中序列化,在java中反序列化,反之亦然。
您可以在以下URL找到ASN.1工具列表(一些是免费的,一些是商业的):

您肯定需要流式传输序列化和传输。20场?哎呀,几十亿块地?即使所有这些都是
int
s,我们也在谈论数GB的数据(十亿乘以32位=3.7Gib)。通过丢弃冗余(这也意味着错误检测/纠正!)、冗余独立性、精确性等,您可以大大减少空间需求。但这并不是什么灵丹妙药。。。你想用一种“标准化”的方法在两种语言之间进行非常离谱的数据交换,但这两种语言不能很好地协同工作?我只是想找一些指导人员,snark对任何人都没有帮助。我们会走这条路,但我们需要尽可能维护原始Java程序的体系结构。最好不要碰Java代码库。@pg1989--你知道,如果你能解释一下你的需求,这会有点帮助。你们知道我所知道的所有细节。这是一个长期研究项目的一部分,所以我自己也不知道每一个细节。@pg1989--我们没有细节。这是一个过程还是单独的过程?如何传达数据?文件管通信连接?你在看什么样的数据速率?呵呵,我不知道,巴德。如果我在接下来的几天里从我的合著者那里得到一些消息,我将编辑这篇文章。不过,谢谢你给了我很多问题!(这听起来可能有些讽刺,但我真的很欣赏你的怀疑。)有趣。。。我一定会调查的。谢谢,谢谢,我有很多事情要考虑,哈哈。