Send serialzed as message

I am developing an android application and want to transfer data from one profile to another through messages. One approach that i thought of is to send serialized java object through message and de-serialize on receiving end. I think this is the simplest approach. Problem with this that it doesn’t work with SmakAPI it gives Read error exception and closes the connection.

Here is the code that i used to send message. It works fine for plain text. Like if i send “abc”

it works fine.

Message message = new Message();
                    message.setTo("**@*.com");
                    testAB obj=new testAB(2,"abc");
                    String serializedObject = "";                     // serialize the object
                    try {
                        ByteArrayOutputStream bo = new ByteArrayOutputStream();
                        ObjectOutputStream so = new ObjectOutputStream(bo);
                        so.writeObject(obj);
                        so.flush();
                        serializedObject = bo.toString();
                    } catch (Exception e) {
                        System.out.println(e);
                    }
                    message.addBody("App1 Eng", serializedObject);
            try {
                finalCon.sendPacket(message);
            } catch (SmackException.NotConnectedException e) {
                Log.i("App1 Send ", "Packet Sending Failed");
                e.printStackTrace();
            }

Here is exception message,

10-13 22:09:04.767
2925-3250/bashsol.smackv3 W/AbstractXMPPConnection﹕ Connection closed with error
javax.net.ssl.SSLException: Read error: ssl=0xb9203cc0: I/O error during system call, Connection reset by peer
at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method)
at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketIm pl.java:689)
at java.io.InputStreamReader.read(InputStreamReader.java:233)
at java.io.BufferedReader.read(BufferedReader.java:325)
at org.jivesoftware.smack.util.ObservableReader.read(ObservableReader.java:41)
at org.kxml2.io.KXmlParser.fillBuffer(KXmlParser.java:1506)
at org.kxml2.io.KXmlParser.peekType(KXmlParser.java:986)
at org.kxml2.io.KXmlParser.next(KXmlParser.java:346)
at org.kxml2.io.KXmlParser.next(KXmlParser.java:310)
at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPC onnection.java:1151)
at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$200(XMPPTCPCon nection.java:937)
at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnecti on.java:952)
at java.lang.Thread.run(Thread.java:841)
10-13 22:09:04.767
2925-3250/bashsol.smackv3 D/SMACK﹕ XMPPConnection closed due to an exception (0)
10-13 22:09:04.767
2925-3250/bashsol.smackv3 W/System.err﹕ javax.net.ssl.SSLException: Read error: ssl=0xb9203cc0: I/O error during system call, Connection reset by peer
10-13 22:09:04.767
2925-3250/bashsol.smackv3 W/System.err﹕ at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method)
10-13 22:09:04.767
2925-3250/bashsol.smackv3 W/System.err﹕ at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketIm pl.java:689)
10-13 22:09:04.767
2925-3250/bashsol.smackv3 W/System.err﹕ at java.io.InputStreamReader.read(InputStreamReader.java:233)
10-13 22:09:04.767
2925-3250/bashsol.smackv3 W/System.err﹕ at java.io.BufferedReader.read(BufferedReader.java:325)
10-13 22:09:04.767
2925-3250/bashsol.smackv3 W/System.err﹕ at org.jivesoftware.smack.util.ObservableReader.read(ObservableReader.java:41)
10-13 22:09:04.767
2925-3250/bashsol.smackv3 W/System.err﹕ at org.kxml2.io.KXmlParser.fillBuffer(KXmlParser.java:1506)
10-13 22:09:04.767
2925-3250/bashsol.smackv3 W/System.err﹕ at org.kxml2.io.KXmlParser.peekType(KXmlParser.java:986)
10-13 22:09:04.767
2925-3250/bashsol.smackv3 W/System.err﹕ at org.kxml2.io.KXmlParser.next(KXmlParser.java:346)
10-13 22:09:04.767
2925-3250/bashsol.smackv3 W/System.err﹕ at org.kxml2.io.KXmlParser.next(KXmlParser.java:310)
10-13 22:09:04.767
2925-3250/bashsol.smackv3 W/System.err﹕ at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPC onnection.java:1151)
10-13 22:09:04.767
2925-3250/bashsol.smackv3 W/System.err﹕ at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$200(XMPPTCPCon nection.java:937)
10-13 22:09:04.767
2925-3250/bashsol.smackv3 W/System.err﹕ at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnecti on.java:952)
10-13 22:09:04.767
2925-3250/bashsol.smackv3 W/System.err﹕ at java.lang.Thread.run(Thread.java:841)

I want to ask if there is any solution to this or any other method in SmackAPI to send serialized object.

And if not what are possible ways to send class object between different profiles (Like in xml encoding etc) which require less coding effort.

@Flow

Never put data into the message body which is not meant for humans. Use a custom extension element for this, e.g. by using DefaulitExtensionElement:

DefaultExtensionElement e = new DefaultExtensionElement(“my-extension”, “my-namespace”);

e.setValue(“my-data”, serializedDataString);

message.addExtension(e);

1 Like

Besides what you did should work, although it is highly discouraged. It’s not possible to determine the reason why the connection is terminated uncleanly (most likley by the server). Look at the server logs, they should provide a reason why the connection is terminated (if it’s done by the server).

Thanks this worked!