Search code examples
javaandroidsqlserializable

Java - java.io.NotSerializableException: net.sourceforge.jtds.jdbc.JtdsConnection


I'd like to share a class from activity to another. I tried everything, searched everywhere, but can't solve my problem. The most important is that I have to use BusinessLogic as a controll class of the whole App. Every variable, methods are in it.. Could somebody help me out?

public void ConnectSQL() {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
    try {
        Class.forName("net.sourceforge.jtds.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:jtds:sqlserver://192.168.3.10;databaseName=hungary;user=stockiduser;password=Berwin1559;loginTimeout=5;socketTimeout=5");
        KapcsolatAllasKijelzes(false);
    } catch (Exception e) {
        KapcsolatAllasKijelzes(true);
    }
}

This method located is in my class named BusinessLogic... Here is MainActivity code:

Intent intent=new Intent(this, Kiszedes.class);
intent.putExtra("bl",bl);
startActivity(intent);

Kiszedes.class is the target activity:

 BusinessLogic bl = (BusinessLogic) getIntent().getSerializableExtra("bl");

Here is what LogCat says:

proba.diszpo E/AndroidRuntime: FATAL EXCEPTION: main
Process: proba.diszpo, PID: 11721
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = proba.diszpo.BusinessLogic)
    at android.os.Parcel.writeSerializable(Parcel.java:1526)
    at android.os.Parcel.writeValue(Parcel.java:1474)
    at android.os.Parcel.writeArrayMapInternal(Parcel.java:723)
    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1408)
    at android.os.Bundle.writeToParcel(Bundle.java:1133)
    at android.os.Parcel.writeBundle(Parcel.java:763)
    at android.content.Intent.writeToParcel(Intent.java:8660)
    at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3154)
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1518)
    at android.app.Activity.startActivityForResult(Activity.java:4226)
    at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:48)
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:77)
    at android.app.Activity.startActivityForResult(Activity.java:4185)
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)
    at android.app.Activity.startActivity(Activity.java:4509)
    at android.app.Activity.startActivity(Activity.java:4477)
    at proba.diszpo.MainActivity.onClick(MainActivity.java:177)
    at android.view.View.performClick(View.java:5675)
    at android.view.View$PerformClick.run(View.java:22641)
    at android.os.Handler.handleCallback(Handler.java:836)
    at android.os.Handler.dispatchMessage(Handler.java:103)
    at android.os.Looper.loop(Looper.java:203)
    at android.app.ActivityThread.main(ActivityThread.java:6251)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
Caused by: java.io.NotSerializableException: net.sourceforge.jtds.jdbc.JtdsConnection
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1224)
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1584)
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1549)
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1472)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1218)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
    at android.os.Parcel.writeSerializable(Parcel.java:1521)
    at android.os.Parcel.writeValue(Parcel.java:1474) 
    at android.os.Parcel.writeArrayMapInternal(Parcel.java:723) 
    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1408) 
    at android.os.Bundle.writeToParcel(Bundle.java:1133) 
    at android.os.Parcel.writeBundle(Parcel.java:763) 
    at android.content.Intent.writeToParcel(Intent.java:8660) 
    at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3154) 
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1518) 
    at android.app.Activity.startActivityForResult(Activity.java:4226) 
    at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:48) 
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:77) 
    at android.app.Activity.startActivityForResult(Activity.java:4185) 
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859) 
    at android.app.Activity.startActivity(Activity.java:4509) 
    at android.app.Activity.startActivity(Activity.java:4477) 
    at proba.diszpo.MainActivity.onClick(MainActivity.java:177) 
    at android.view.View.performClick(View.java:5675) 
    at android.view.View$PerformClick.run(View.java:22641) 
    at android.os.Handler.handleCallback(Handler.java:836) 
    at android.os.Handler.dispatchMessage(Handler.java:103) 
    at android.os.Looper.loop(Looper.java:203) 
    at android.app.ActivityThread.main(ActivityThread.java:6251) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)

Solution

  • Your BusinessLogic class contains a reference to a JtdsConnection object, which is not serializable. It's not enough for BusinessLogic to be Serializable, all of its members (and members of members, etc). need to be Serializable as well.

    Since JtdsConnection is not a class you've created, you cannot make it Serializable. Anyhow, the way you're trying to make this work is not really correct.


    I suggest having a global instance of your business logic so you'll be able to access it from any activity / fragment.

    In my projects I usually create a Conf class with static instances of objects I need. In your case you could have something like this:

    public class Conf {
    
        @Nullable
        private static BusinessLogic businessLogic;
    
        @NonNull
        public static BusinessLogic getBusinessLogic() {
    
            if (businessLogic == null) {
                businessLogic = new BusinessLogic();
            }
    
            return businessLogic;
        }
    }
    

    In your activity you can now simply do: BusinessLogic bl = Conf.getBusinessLogic().