如何在Erlang之外创建表示DICT术语的字符串?

如何在Erlang之外创建表示DICT术语的字符串?,erlang,Erlang,我想在Java中构造一个表示DICT术语的字符串,它将被传递到Erlang进程,作为Erlang术语(字符串到术语)反射回来 我可以很容易地为ORDDICT实现这一点,因为它们在元组列表中被构造为一个简单的排序键/值对,例如:[{field1,“value1”},{field2,“value2}] 但是,对于DICT,它们被编译成一个特定的术语,我想知道如何对其进行反向工程。我知道这种结构会随着新版本的发布而改变,但性能和易于与Java集成的好处将克服这一点。不幸的是,Erlang的JInter

我想在Java中构造一个表示DICT术语的字符串,它将被传递到Erlang进程,作为Erlang术语(字符串到术语)反射回来

我可以很容易地为ORDDICT实现这一点,因为它们在元组列表中被构造为一个简单的排序键/值对,例如:[{field1,“value1”},{field2,“value2}]

但是,对于DICT,它们被编译成一个特定的术语,我想知道如何对其进行反向工程。我知道这种结构会随着新版本的发布而改变,但性能和易于与Java集成的好处将克服这一点。不幸的是,Erlang的JInterface基于简单的数据结构。高效的DICT类型应该是非常有用

一个简单的dict定义如下:

D1 = dict:store("field1","AAA",dict:new()).
{dict,1,16,16,8,80,48,
  {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
  {{[],[],[],[],[],[],[],[],
    [["field1",65,65,65]],
    [],[],[],[],[],[],[]}}}
正如上面所看到的,有些坐标我不明白它们的意思(数字1,16,16,8,80,48和一组空列表,它们可能也代表一些东西)

添加另外两行(键值对)会导致数据如下所示:

D3 = dict:store("field3","CCC",D2).
{dict,3,16,16,8,80,48,
  {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
  {{[],[],
    [["field3",67,67,67]],
    [],[],[],[],[],
    [["field1",65,65,65]],
    [],[],[],[],
    [["field2",66,66,66]],
    [],[]}}}
从上面我可以注意到:

  • 第一个数字(3)重复预设DICT中的项目数
  • 第二个数字(16)显示列表第一个元组中的列表插槽的数量
  • 第第三个数字(16)显示列表中第二个Typle的列表<强>时隙< /强>,其中这些值最后放在中间(
  • )。
  • 第四个数字(8)似乎是第二行元组中放置值的插槽数(一种索引指针)
  • 剩下的数字(80和48)…不知道
  • 添加键“field0”不会放在末尾,而是放在“field1”的数据之后。这表明了索引方法

那么问题是,有没有一种方法(算法)可以从Erlang外部可靠地直接创建DICT字符串?

可以在源代码中找到DICT实现的全面规范


但我不确定在Java中复制dict.erl的实现是否值得。这只有在您想要一个类似于dict的快速数据结构,并且需要经常在Java和Erlang代码之间传递时才有意义。使用Erlang和Java的键值存储而不直接传递它可能更有意义。这取决于您的应用程序例如,这可能是,或者甚至可能是将您的不同语言世界与连接起来。这两个示例都是用Erlang实现的,并且很容易从这两个世界访问。

一般来说,依赖库的内部工作而不是公共接口不是好的做法。内部可能随时发生变化,而接口应该保持稳定。谢谢。实际上我已经在使用RabbitMq进行通信,但出于性能原因,我想向erlang队列使用者发送一个预摘要DICT(在java端生成一个proplist的成本与直接创建一个DICT而不是在erlang端倒带它的成本相比。只有基准测试可以告诉我们…我将按照您的建议使用DICT.erl源代码。600多行代码…看起来不太具挑战性,可能值得将其转发到JInterface代码行。@gextra you will n如果你想走这条路,你需要一个erlang:phash/2的Java实现。