Serialized Classes

Post here your questions about SFS2X. Here we discuss all server-side matters. For client API questions see the dedicated forums.

Moderators: Lapo, Bax

Fenlena
Posts: 6
Joined: 26 Dec 2018, 03:14

Serialized Classes

Postby Fenlena » 14 Jan 2019, 19:38

I am trying to create a serialized class server side and send it back to the Unity client. On the server, I have the interface below

Code: Select all

package com.test.lobby;

public interface CULInterface
{
   String getDisplayName(int i);
   void setDisplayName(int i, String dName);
   String getBuddyIgnore(int i);
   void setBuddyIgnore(int i, String bi);
   int getOnlineStatus(int i);
   void setOnlineStatus(int i, int status);
   int getActualStatus(int i);
   void setActualStatus(int i, int status);
   Boolean getAcceptPM(int i);
   void setAcceptPM(int i, boolean accept);
   Boolean getAcceptBuddy(int i);
   void setAcceptBuddy(int i, boolean accept);
   Boolean getAcceptChallenge(int i);
   void setAcceptChallenge(int i, boolean accept);
   
   String[] getDNameList();
   void setDisplayNameList(String[] dName);
   String[] getBuddyIgnoreList();
   void setBuddyIgnoreList(String[] bi);
   int[] getOnlineStatusList();
   void setOnlineStatusList(int[] status);
   int[] getActualStatusList();
   void setActualStatusList(int[] status);
   boolean[] getAcceptPMList();
   void setAcceptPMList(boolean[] accept);
   boolean[] getAcceptBuddyList();
   void setAcceptBuddyList(boolean[] accept);
   boolean[] getAcceptChallengeList();
   void setAcceptChallengListe(boolean[] accept);
}

and the class that implements the interface.

Code: Select all

package com.test.lobby;

import com.smartfoxserver.v2.protocol.serialization.SerializableSFSType;

public class CustomUserList implements CULInterface, SerializableSFSType
{
   String[] dNameList;
   String[] buddyIgnoreList;
   int[] onlineStatusList;
   int[] actualStatusList;
   boolean[] acceptPMList;
   boolean[] acceptBuddyList;
   boolean[] acceptChallengeList;
   
   public CustomUserList()
   {
      
   }
   
   public CustomUserList(int size)
   {
      dNameList = new String[size];
      buddyIgnoreList = new String[size];
      onlineStatusList = new int[size];
      actualStatusList = new int[size];
      acceptPMList = new boolean[size];
      acceptBuddyList = new boolean[size];
      acceptChallengeList = new boolean[size];
   }
   
   @Override
   public String getDisplayName(int i)
   {
      return dNameList[i];
   }
   @Override
   public void setDisplayName(int i, String dName)
   {
      dNameList[i] = dName;
   }
   @Override
   public String getBuddyIgnore(int i)
   {
      return buddyIgnoreList[i];
   }
   @Override
   public void setBuddyIgnore(int i, String bi)
   {
      buddyIgnoreList[i] = bi;
   }
   @Override
   public int getOnlineStatus(int i)
   {
      return onlineStatusList[i];
   }
   @Override
   public void setOnlineStatus(int i, int status)
   {
      onlineStatusList[i] = status;
   }
   @Override
   public int getActualStatus(int i)
   {
      return actualStatusList[i];
   }
   @Override
   public void setActualStatus(int i, int status)
   {
      actualStatusList[i] = status;
   }
   @Override
   public Boolean getAcceptPM(int i)
   {
      return acceptPMList[i];
   }
   @Override
   public void setAcceptPM(int i, boolean accept)
   {
      acceptPMList[i] = accept;
   }
   @Override
   public Boolean getAcceptBuddy(int i)
   {
      return acceptBuddyList[i];
   }
   @Override
   public void setAcceptBuddy(int i, boolean accept)
   {
      acceptBuddyList[i] = accept;
   }
   @Override
   public Boolean getAcceptChallenge(int i)
   {
      return acceptChallengeList[i];
   }
   @Override
   public void setAcceptChallenge(int i, boolean accept)
   {
      acceptChallengeList[i] = accept;
   }
   @Override
   public String[] getDNameList()
   {
      return dNameList;
   }

   @Override
   public void setDisplayNameList(String[] dName)
   {
      dNameList = dName;      
   }

   @Override
   public String[] getBuddyIgnoreList()
   {
      return buddyIgnoreList;
   }

   @Override
   public void setBuddyIgnoreList(String[] bi)
   {
      buddyIgnoreList = bi;
   }

   @Override
   public int[] getOnlineStatusList()
   {
      return onlineStatusList;
   }

   @Override
   public void setOnlineStatusList(int[] status)
   {
      onlineStatusList = status;
   }

   @Override
   public int[] getActualStatusList()
   {
      return actualStatusList;
   }

   @Override
   public void setActualStatusList(int[] status)
   {
      actualStatusList = status;
   }

   @Override
   public boolean[] getAcceptPMList()
   {
      return acceptPMList;
   }

   @Override
   public void setAcceptPMList(boolean[] accept)
   {
      acceptPMList = accept;
   }

   @Override
   public boolean[] getAcceptBuddyList()
   {
      return acceptBuddyList;
   }

   @Override
   public void setAcceptBuddyList(boolean[] accept)
   {
      acceptBuddyList = accept;
   }

   @Override
   public boolean[] getAcceptChallengeList()
   {
      return acceptChallengeList;
   }

   @Override
   public void setAcceptChallengListe(boolean[] accept)
   {
      acceptChallengeList = accept;
   }
}

Back in Unity, I have the interface

Code: Select all

using Sfs2X.Protocol.Serialization;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace com.test.lobby
{
    public interface CULInterface : SerializableSFSType
    {
        string getDisplayName(int i);
        void setDisplayName(int i, string dName);
        string getBuddyIgnore(int i);
        void setBuddyIgnore(int i, string bi);
        int getOnlineStatus(int i);
        void setOnlineStatus(int i, int status);
        int getActualStatus(int i);
        void setActualStatus(int i, int status);
        bool getAcceptPM(int i);
        void setAcceptPM(int i, bool accept);
        bool getAcceptBuddy(int i);
        void setAcceptBuddy(int i, bool accept);
        bool getAcceptChallenge(int i);
        void setAcceptChallenge(int i, bool accept);

        string[] getDNameList();
        void setDisplayNameList(string[] dName);
        string[] getBuddyIgnoreList();
        void setBuddyIgnoreList(string[] bi);
        int[] getOnlineStatusList();
        void setOnlineStatusList(int[] status);
        int[] getActualStatusList();
        void setActualStatusList(int[] status);
        bool[] getAcceptPMList();
        void setAcceptPMList(bool[] accept);
        bool[] getAcceptBuddyList();
        void setAcceptBuddyList(bool[] accept);
        bool[] getAcceptChallengeList();
        void setAcceptChallengListe(bool[] accept);
    }
}

and the class that implements the interface.

Code: Select all

namespace com.test.lobby
{
    public class CustomUserList : MonoBehaviour, SerializableSFSType, CULInterface
    {
        string[] dNameList;
        string[] buddyIgnoreList;
        int[] onlineStatusList;
        int[] actualStatusList;
        bool[] acceptPMList;
        bool[] acceptBuddyList;
        bool[] acceptChallengeList;

        public CustomUserList()
        {

        }

        public CustomUserList(int size)
        {
            dNameList = new string[size];
            buddyIgnoreList = new string[size];
            onlineStatusList = new int[size];
            actualStatusList = new int[size];
            acceptPMList = new bool[size];
            acceptBuddyList = new bool[size];
            acceptChallengeList = new bool[size];
        }

        public string getDisplayName(int i)
        {
            return dNameList[i];
        }

        public void setDisplayName(int i, string dName)
        {
            dNameList[i] = dName;
        }

        public string getBuddyIgnore(int i)
        {
            return buddyIgnoreList[i];
        }

        public void setBuddyIgnore(int i, string bi)
        {
            buddyIgnoreList[i] = bi;
        }

        public int getOnlineStatus(int i)
        {
            return onlineStatusList[i];
        }

        public void setOnlineStatus(int i, int status)
        {
            onlineStatusList[i] = status;
        }

        public int getActualStatus(int i)
        {
            return actualStatusList[i];
        }

        public void setActualStatus(int i, int status)
        {
            actualStatusList[i] = status;
        }

        public bool getAcceptPM(int i)
        {
            return acceptPMList[i];
        }

        public void setAcceptPM(int i, bool accept)
        {
            acceptPMList[i] = accept;
        }

        public bool getAcceptBuddy(int i)
        {
            return acceptBuddyList[i];
        }

        public void setAcceptBuddy(int i, bool accept)
        {
            acceptBuddyList[i] = accept;
        }

        public bool getAcceptChallenge(int i)
        {
            return acceptChallengeList[i];
        }

        public void setAcceptChallenge(int i, bool accept)
        {
            acceptChallengeList[i] = accept;
        }

        public string[] getDNameList()
        {
            return dNameList;
        }


        public void setDisplayNameList(string[] dName)
        {
            dNameList = dName;
        }


        public string[] getBuddyIgnoreList()
        {
            return buddyIgnoreList;
        }


        public void setBuddyIgnoreList(string[] bi)
        {
            buddyIgnoreList = bi;
        }


        public int[] getOnlineStatusList()
        {
            return onlineStatusList;
        }


        public void setOnlineStatusList(int[] status)
        {
            onlineStatusList = status;
        }


        public int[] getActualStatusList()
        {
            return actualStatusList;
        }


        public void setActualStatusList(int[] status)
        {
            actualStatusList = status;
        }


        public bool[] getAcceptPMList()
        {
            return acceptPMList;
        }


        public void setAcceptPMList(bool[] accept)
        {
            acceptPMList = accept;
        }


        public bool[] getAcceptBuddyList()
        {
            return acceptBuddyList;
        }


        public void setAcceptBuddyList(bool[] accept)
        {
            acceptBuddyList = accept;
        }


        public bool[] getAcceptChallengeList()
        {
            return acceptChallengeList;
        }


        public void setAcceptChallengListe(bool[] accept)
        {
            acceptChallengeList = accept;
        }
    }
}

Once the CustomUserList has been popluated with data, I try to send it back to the Unity client with

Code: Select all

ISFSObject response = new SFSObject();
response.putClass("ul", returnUserList);
send("gu", response, sender);

but I get the following error in the SmartFoxServer console.

Code: Select all

 WARN  [SFSWorker:Ext:3] protocol.SFSIoHandler     - com.smartfoxserver.v2.exceptions.SFSRuntimeException:
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Exception: com.smartfoxserver.v2.exceptions.SFSRuntimeException
Message: java.lang.ClassCastException: [I cannot be cast to [Ljava.lang.Object;
+--- --- ---+
Stack Trace:
+--- --- ---+
com.smartfoxserver.v2.protocol.serialization.DefaultSFSDataSerializer.pojo2sfs(DefaultSFSDataSerializer.java:1461)
com.smartfoxserver.v2.protocol.serialization.DefaultSFSDataSerializer.encodeObject(DefaultSFSDataSerializer.java:852)
com.smartfoxserver.v2.protocol.serialization.DefaultSFSDataSerializer.obj2bin(DefaultSFSDataSerializer.java:519)
com.smartfoxserver.v2.protocol.serialization.DefaultSFSDataSerializer.object2binary(DefaultSFSDataSerializer.java:502)
com.smartfoxserver.v2.protocol.serialization.DefaultSFSDataSerializer.encodeObject(DefaultSFSDataSerializer.java:848)
com.smartfoxserver.v2.protocol.serialization.DefaultSFSDataSerializer.obj2bin(DefaultSFSDataSerializer.java:519)
com.smartfoxserver.v2.protocol.serialization.DefaultSFSDataSerializer.object2binary(DefaultSFSDataSerializer.java:502)
com.smartfoxserver.v2.protocol.serialization.DefaultSFSDataSerializer.encodeObject(DefaultSFSDataSerializer.java:848)
com.smartfoxserver.v2.protocol.serialization.DefaultSFSDataSerializer.obj2bin(DefaultSFSDataSerializer.java:519)
com.smartfoxserver.v2.protocol.serialization.DefaultSFSDataSerializer.object2binary(DefaultSFSDataSerializer.java:502)
com.smartfoxserver.v2.entities.data.SFSObject.toBinary(SFSObject.java:234)
com.smartfoxserver.v2.protocol.binary.BinaryIoHandler.handleWrite(BinaryIoHandler.java:84)
com.smartfoxserver.v2.protocol.SFSIoHandler.onDataWrite(SFSIoHandler.java:223)
com.smartfoxserver.v2.protocol.SFSProtocolCodec.onPacketWrite(SFSProtocolCodec.java:165)
com.smartfoxserver.bitswarm.core.BitSwarmEngine.writeToSocket(BitSwarmEngine.java:412)
com.smartfoxserver.bitswarm.core.BitSwarmEngine.write(BitSwarmEngine.java:406)
com.smartfoxserver.bitswarm.io.Response.write(Response.java:71)
com.smartfoxserver.v2.api.response.SFSResponseApi.sendExtResponse(SFSResponseApi.java:91)
com.smartfoxserver.v2.api.SFSApi.sendExtensionResponse(SFSApi.java:1515)
com.smartfoxserver.v2.extensions.BaseSFSExtension.send(BaseSFSExtension.java:487)
com.smartfoxserver.v2.extensions.BaseSFSExtension.send(BaseSFSExtension.java:462)
com.smartfoxserver.v2.extensions.BaseClientRequestHandler.send(BaseClientRequestHandler.java:56)
com.test.lobby.GetUserList.handleClientRequest(GetUserList.java:169)
com.smartfoxserver.v2.extensions.SFSExtension.handleClientRequest(SFSExtension.java:208)
com.smartfoxserver.v2.controllers.v290.ExtensionReqController.processRequest(ExtensionReqController.java:174)
com.smartfoxserver.v2.controllers.v290.ExtensionReqController$1.run(ExtensionReqController.java:68)
java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.lang.Thread.run(Unknown Source)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
User avatar
Lapo
Site Admin
Posts: 23008
Joined: 21 Mar 2005, 09:50
Location: Italy

Re: Serialized Classes

Postby Lapo » 15 Jan 2019, 10:04

Hi,
it looks like the problem is the use of native arrays (such as string[]) in C# which are not supported.
Instead you should be using ArrayList or List<?>. See the docs here:
http://docs2x.smartfoxserver.com/Advanc ... ialization

In particular the type conversion table

Thanks
Lapo
--
gotoAndPlay()
...addicted to flash games

Return to “SFS2X Questions”

Who is online

Users browsing this forum: No registered users and 60 guests