Hi there,<br><br>I use dbus-java to communicate via DBus. This works
fine as long as I stick to primitve types natively supported by the
java dbus lib such as String, int, boolean and so on. However I try to
send objects instances (of a class called Metadata) via DBus, which
have
a String member and a ArrayList&lt;String&gt; member. So I implemented
the serialize and deserialize methods according to the API and the
tutorial which ships with the lib.&nbsp; When trying to call a remote method
which
should deliver a Metadata object, I receive the following exception:<br><br>Exception in thread &quot;main&quot; org.freedesktop.dbus.exceptions<div id="mb_0">.DBusExecutionException: Wrong return type (not expecting Tuple)<br>
&nbsp;&nbsp;&nbsp; at org.freedesktop.dbus.RemoteInvocationHandler.convertRV(RemoteInvocationHandler.java:65)<br>

&nbsp;&nbsp;&nbsp; at org.freedesktop.dbus.RemoteInvocationHandler.executeRemoteMethod(RemoteInvocationHandler.java:138)<br>&nbsp;&nbsp;&nbsp; at org.freedesktop.dbus.RemoteInvocationHandler.invoke(RemoteInvocationHandler.java:187)<br>&nbsp;&nbsp;&nbsp; at $Proxy1.pongMD(Unknown Source)<br>


&nbsp;&nbsp;&nbsp; at de.ichaus.entw.DBusTest.dBusClient.DBusClient.main(DBusClient.java:65)<br><br>I put together a small testcase existing of a server and a client in case anyone want to run it.<br><br>I thought it might be a problem with that List member in Metadata.
Won&#39;t work with Vector&lt;String&gt;, ArrayList&lt;String&gt; or
Collection&lt;String&gt; either. <br>I tried both versions <span></span>Version 2.4 and 1.13 of the library.<br><br>It would be great if anyone could suggest something I am missing out on or got wrong. :)<br><br>Greetings Johannes Felten<br>

<br>CLASSES:<br><br>//------------------------------------------------------------------------------------------------------------------<br>package de.ichaus.entw.DBusTest.dBusServer;<br><br>import java.io.IOException;<br>

<br>import org.freedesktop.dbus.DBusConnection;<br>import org.freedesktop.dbus.exceptions.DBusException;<br><br>public class DBusServer{<br><br>&nbsp;&nbsp;&nbsp; private static DBusConnection conn = null;<br>&nbsp;&nbsp;&nbsp; private static Pong pongObj = null;<br>

<br>&nbsp;&nbsp;&nbsp; private static void connect(){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; conn = DBusConnection.getConnection(DBusConnection.SESSION);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; conn.requestBusName(&quot;de.ichaus.entw.DBusServerPingPong&quot;);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; conn.exportObject(&quot;/pongObj&quot;,pongObj);<br>

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (DBusException e) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp; &nbsp;* @param args<br>&nbsp;&nbsp;&nbsp; &nbsp;*/<br>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pongObj = new Pong();<br>

<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; connect();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.print(&quot;Press ENTER to exit.&quot;);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.in.read();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (IOException e) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block<br>

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; finally{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; conn.disconnect();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; }<br><br>}<br><br>//------------------------------------------------------------------------------------------------------------------<br>

<br>package de.ichaus.entw.DBusTest.dBusServer;<br><br>import java.util.ArrayList;<br><br>import org.freedesktop.dbus.DBusInterface;<br>import org.freedesktop.dbus.Tuple;<br><br>import de.ichaus.entw.DBusTest.types.Metadata;<br>

<br>public class Pong implements DBusConnectorInterface {<br><br>&nbsp;&nbsp;&nbsp; private Metadata pongMD;<br><br>&nbsp;&nbsp;&nbsp; public Pong(){};<br><br>&nbsp;&nbsp;&nbsp; public String pong() {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return &quot;pong&quot;;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; public void makeMD(String mdStr){<br>

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ArrayList&lt;String&gt; strLst = new ArrayList&lt;String&gt;(3);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int i=0; i&lt;3; i++)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; strLst.add(mdStr+&quot;_&quot;+i);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pongMD = new Metadata(mdStr, strLst);<br>&nbsp;&nbsp;&nbsp; }<br>

<br>&nbsp;&nbsp;&nbsp; public Metadata pongMD(){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return pongMD;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; public boolean isRemote() {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp; }<br><br>}<br><br>
<br>
//------------------------------------------------------------------------------------------------------------------<br><br>package de.ichaus.entw.DBusTest.dBusClient;<br><br>import java.util.Calendar;<br><br>import org.freedesktop.dbus.DBusConnection;<br>

import org.freedesktop.dbus.exceptions.DBusException;<br><br>import de.ichaus.entw.DBusTest.dBusServer.DBusConnectorInterface;<br>import de.ichaus.entw.DBusTest.dBusServer.Pong;<br><br>public class DBusClient {<br><br>&nbsp;&nbsp;&nbsp; private static DBusConnection conn = null;<br>

&nbsp;&nbsp;&nbsp; private static DBusConnectorInterface pongObj = null;<br><br>&nbsp;&nbsp;&nbsp; private static void connect(){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; conn = DBusConnection.getConnection(DBusConnection.SESSION);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //pongObj = (DBusConnectorInterface)conn.getRemoteObject(&quot;de.ichaus.entw.DBusServerPingPong&quot;, &quot;/pongObj&quot;);<br>

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //pongObj = (DBusConnectorInterface)conn.getRemoteObject(&quot;de.ichaus.entw.DBusServerPingPong&quot;, &quot;/pongObj&quot;, de.ichaus.entw.DBusTest.dBusServer.DBusConnectorInterface.class);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pongObj = (DBusConnectorInterface)conn.getRemoteObject(&quot;de.ichaus.entw.DBusServerPingPong&quot;, &quot;/pongObj&quot;, DBusConnectorInterface.class);<br>

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (DBusException e) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; private static String getTimeStamp(){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Calendar rightNow = Calendar.getInstance();<br>

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return rightNow.get(Calendar.YEAR) + &quot;-&quot;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + (rightNow.get(Calendar.MONTH) + 1) + &quot;-&quot;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + rightNow.get(Calendar.DAY_OF_MONTH) + &quot; &quot;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + rightNow.get(Calendar.HOUR_OF_DAY) + &quot;:&quot;<br>

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + rightNow.get(Calendar.MINUTE) + &quot;:&quot;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + rightNow.get(Calendar.SECOND) + &quot;.&quot;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; + rightNow.get(Calendar.MILLISECOND);<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp; &nbsp;* @param args<br>

&nbsp;&nbsp;&nbsp; &nbsp;*/<br>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(&quot;Starttime:&nbsp;&nbsp;&nbsp; &quot; + getTimeStamp());<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; connect();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(&quot;Connected:&nbsp;&nbsp;&nbsp; &quot; + getTimeStamp());<br>

<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(&quot;\n Play some ping pong...&quot;);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 10; i++) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(&quot;I said ping...&quot;);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (pongObj != null)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(&quot;Server said &quot; + pongObj.pong());<br>

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(&quot;Server said nothing...&quot;);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(&quot;Endtime:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot; + getTimeStamp());<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(&quot; Finished ping pong play.&quot;);<br>

<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(&quot;\nPlay some Metadata ping pong...&quot;);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 10; i++) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(&quot;I said makeMD...&quot;);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (pongObj != null)<br>

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pongObj.makeMD(&quot;pong_&quot;+i);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(&quot;Server said &quot; + pongObj.pongMD());<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(&quot;Server said nothing...&quot;);<br>

&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(&quot; Finished Metadata ping pong.&quot;);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (conn != null)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; conn.disconnect();<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println(&quot;Disconnected: &quot; + getTimeStamp());<br>

&nbsp;&nbsp;&nbsp; }<br>}<br><br>//------------------------------------------------------------------------------------------------------------------<br>
package de.ichaus.entw.DBusTest.dBusServer;<br><br>import org.freedesktop.dbus.DBusInterface;<br><br>import de.ichaus.entw.DBusTest.types.Metadata;<br><br>public interface DBusConnectorInterface extends DBusInterface {<br>

<br>&nbsp;&nbsp;&nbsp; public String pong();<br>&nbsp;&nbsp;&nbsp; public void makeMD(String mdStr);<br>&nbsp;&nbsp;&nbsp; public Metadata pongMD();<br><br>}<br><br>//------------------------------------------------------------------------------------------------------------------<br>


<br>package de.ichaus.entw.DBusTest.types;<br><br>import java.util.ArrayList;<br>import java.util.List;<br><br>import org.freedesktop.dbus.DBusSerializable;<br>import org.freedesktop.dbus.Position;<br>import org.freedesktop.dbus.exceptions.DBusException;<br>

<br>public class Metadata implements DBusSerializable{<br><br>&nbsp;&nbsp;&nbsp; @Position(0)<br>&nbsp;&nbsp;&nbsp; private String md5Sum = &quot;&quot;;<br>&nbsp;&nbsp;&nbsp; @Position(1)<br>&nbsp;&nbsp;&nbsp; private List&lt;String&gt; someStrings;<br><br>&nbsp;&nbsp;&nbsp; public Metadata(){}<br>

<br>&nbsp;&nbsp;&nbsp; public Metadata(String md5, List&lt;String&gt; strings){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; md5Sum = md5;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; someStrings = strings;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; public Object[] serialize() throws DBusException {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return new Object[] {this.md5Sum, this.someStrings};<br>

&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; public void deserialize(String md5sum, List&lt;String&gt; someStrings){<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.md5Sum = md5sum;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.someStrings = new ArrayList&lt;String&gt;(someStrings);<br>&nbsp;&nbsp;&nbsp; }<br><br>}<br><br>//------------------------------------------------------------------------------------------------------------------</div>