如何通过 DBus 发送带有 java 的 {sv}?
How to send a{sv} with java through DBus?
我的目标是在 DBus 上发送键值字典,接收并处理它。
我创建了字典并添加了一些值:
Map<String, Variant<?>> argumentsToSend = new HashMap<String, Variant<?>>();
argumentsToSend.put("arg1", new Variant<Integer>(111));
argumentsToSend.put("arg2", new Variant<Integer>(222));
proxy.getObject().useTheseArgs(argumentsToSend);
字典已发送,但在接收端它被视为 {sv} 而不是 {sv}。
(process:10144): GLib-CRITICAL **: GVariant 格式字符串 'a{sv}' 的类型为 'a{sv}' 但给定值的类型为 '{sv}'
我错过了什么?
要确定您发送的消息的类型,您需要解码签名(您拥有的 a{sv}
)。这是一个快速细分:
a
= 数组(列表)
{sv}
= 字符串到变体的字典
因此,由于我们将 a{sv}
作为签名,并且 dbus-java
将 java.util.list
转换为 DBus 数组,因此您所要做的就是将代码更改为如下所示以下:
List<Map<String, Variant<?>>> argumentsToSend = new ArrayList<>();
argumentsToSend.add( new HashMap<String, Variant<?>>() );
argumentsToSend.add( new HashMap<String, Variant<?>>() );
argumentsToSend.get(0).put("arg1", new Variant<Integer>(111));
argumentsToSend.get(1).put("arg2", new Variant<Integer>(222));
proxy.getObject().useTheseArgs(argumentsToSend);
有关类型的更多信息(其中还包括一个 a{sv}
示例):https://rm5248.com/d-bus-tutorial/
我的目标是在 DBus 上发送键值字典,接收并处理它。
我创建了字典并添加了一些值:
Map<String, Variant<?>> argumentsToSend = new HashMap<String, Variant<?>>();
argumentsToSend.put("arg1", new Variant<Integer>(111));
argumentsToSend.put("arg2", new Variant<Integer>(222));
proxy.getObject().useTheseArgs(argumentsToSend);
字典已发送,但在接收端它被视为 {sv} 而不是 {sv}。
(process:10144): GLib-CRITICAL **: GVariant 格式字符串 'a{sv}' 的类型为 'a{sv}' 但给定值的类型为 '{sv}'
我错过了什么?
要确定您发送的消息的类型,您需要解码签名(您拥有的 a{sv}
)。这是一个快速细分:
a
= 数组(列表)
{sv}
= 字符串到变体的字典
因此,由于我们将 a{sv}
作为签名,并且 dbus-java
将 java.util.list
转换为 DBus 数组,因此您所要做的就是将代码更改为如下所示以下:
List<Map<String, Variant<?>>> argumentsToSend = new ArrayList<>();
argumentsToSend.add( new HashMap<String, Variant<?>>() );
argumentsToSend.add( new HashMap<String, Variant<?>>() );
argumentsToSend.get(0).put("arg1", new Variant<Integer>(111));
argumentsToSend.get(1).put("arg2", new Variant<Integer>(222));
proxy.getObject().useTheseArgs(argumentsToSend);
有关类型的更多信息(其中还包括一个 a{sv}
示例):https://rm5248.com/d-bus-tutorial/